我有一个这样的数据框。
0 1.0
1 None
2 3.0
3 None
Name: B, dtype: object
我想创建一个带有如下计数器的新列。
df = pd.DataFrame({'transaction_id':[12565,12565,12743,12743,13456,13456,13856],
'rep_id':[560,560,560,560,287,287,287]})
答案 0 :(得分:8)
试试 transform
+ factorize
df['new']=df.groupby('rep_id').transaction_id.transform(lambda x : pd.factorize(x)[0]+1)
df
Out[389]:
transaction_id rep_id new
0 12565 560 1
1 12565 560 1
2 12743 560 2
3 12743 560 2
4 13456 287 1
5 13456 287 1
6 13856 287 2
答案 1 :(得分:2)
根据您的数据(如果 transaction_id
不同,则 rep_id
不同)我们还可以:
df['new'] = (df['transaction_id'].ne(df['transaction_id'].shift())
.groupby(df['rep_id']).cumsum()
)
更新:您也可以使用 rank
,尽管它的行为略有不同:
df.groupby('rep_id')['transaction_id'].rank('dense').astype(int)
输出:
transaction_id rep_id new
0 12565 560 1
1 12565 560 1
2 12743 560 2
3 12743 560 2
4 13456 287 1
5 13456 287 1
6 13856 287 2