首页 > 解决方案 > Pandas groupby 并为每一行创建一个唯一的 ID 列

问题描述

我有一个熊猫 DF:

import pandas as pd
df = pd.DataFrame([["apple",1],["apple",20],["apple",21],["mango",31],["mango",17]])
df.columns = ["fruit", "count"]
df

操作:

    fruit   count
0   apple   1
1   apple   20
2   apple   21
3   mango   31
4   mango   17

我正在尝试创建一个unique_row_id, for each roweach group. 例如,对于组appleunique列应该有条目0,1,2,因为有 3 行,对于组mango,它应该0,1有 2 行

df["unique_row_number_per_group"] =df.reset_index().groupby("fruit")["index"].transform(lambda x: pd.factorize(x)[0])

操作:

f   ruit    count   unique_rows_per_group
0   apple   1        0
1   apple   20       1
2   apple   20       2
3   mango   31       0
4   mango   17       1

这很有效,但对于大型 DF 来说需要很长时间,任何关于以更高效的方式执行此操作的建议都会有所帮助

标签: pythonpandasdataframepandas-groupby

解决方案


如果您需要逐行计数,我们有cumcount

df['new'] = df.groupby('fruit').cumcount()
df
Out[346]: 
   fruit  count  new
0  apple      1    0
1  apple     20    1
2  apple     21    2
3  mango     31    0
4  mango     17    1

或者:

df['new'] = df.assign(new=1).groupby('fruit')['new'].cumsum()-1
df
Out[352]: 
   fruit  count  new
0  apple      1    0
1  apple     20    1
2  apple     21    2
3  mango     31    0
4  mango     17    1

推荐阅读