假设我有一个具有重复列值的数据框架
data = {'1':[1, 1, 1, 2, 2, 3, 4, 4, 4, 4]}
df = pd.DataFrame(data)
df.head(10)
1
0 1
1 1
2 1
3 2
4 2
5 3
6 4
7 4
8 4
9 4
如何创建另一个列,该列具有唯一的计数数,用于表示该值之前被看到的次数,可以向上或向下移动。
这是一个期望结果的例子
1 uniquee
0 1 0
1 1 1
2 1 2
3 2 0
4 2 1
5 3 0
6 4 0
7 4 1
8 4 2
9 4 3
往下看,对于列'1'中有重复值的列值,'unique'列包含一个整数,表示该值之前出现的次数。
我想到的一个解决方案是使用iterrows
seen_set = {}
df['uniquee'] = ''
for index, row in df.iterrows():
if row['1'] not in seen_set:
seen_set[row['1']] = 0
else:
seen_set[row['1']] += 1
df.loc[index , 'uniquee'] = seen_set[row['1']]
但是通常不鼓励使用iterrows,因为它往往较慢。有没有计算效率更高的方法?
试试这个:
df.assign(unique = df.groupby('1').cumcount())
按值列对数据框进行分组,然后应用传递lambda函数创建推导式中的数字列表,最后爆炸并重置索引
>>> (df.groupby('1')
.apply(lambda x: [i for i in range(x.size)])
.explode().to_frame('unique').reset_index()
)
输出:
1 unique
0 1 0
1 1 1
2 1 2
3 2 0
4 2 1
5 3 0
6 4 0
7 4 1
8 4 2
9 4 3