对于具有重复列值的行,如何为该值创建具有唯一计数数的另一行

  • 本文关键字:数数 唯一 一行 创建 于具 python pandas
  • 更新时间 :
  • 英文 :


假设我有一个具有重复列值的数据框架

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

最新更新