问题描述
我有一个 Pandas 数据框,其中包含来自超市收银系统的数据,其中列出了每个客户(“ID”)和他们购买的每件商品(“Item”)。我想枚举客户购买的每件商品(“Item_e”)。
ID = [1,1,2,3,3]
Item = ["Apple","Orange","Apple","Banana","Pumpkin","Banana"]
Item_e = ["Apple_1","Orange_1","Apple_2","Apple_3","Orange_2","Banana_1","Banana_2","Apple_1","Pumpkin_1","Banana_1"]
“ID”和“Item”是数据框中的现有列,我想生成“Item_e”作为新列。
如果客户 1 购买了三个苹果,我希望第一个扫描的苹果成为 Apple_1,第二个(在整个购买中出现时)成为 Apple_2,依此类推。如果客户 2 也买了两个苹果,数据集中的第一个又变成 Apple_1,第二个 Apple_2。
解决方法
将 GroupBy.cumcount
与 Series.str.cat
一起使用:
df = pd.DataFrame({"ID":ID,"Item":Item})
s = df.groupby(['ID','Item']).cumcount().add(1).astype(str)
df['Item_e'] = df['Item'].str.cat(s,sep='_')
#alternative
#df['Item_e'] = df['Item'] + '_' + s
print (df)
ID Item Item_e
0 1 Apple Apple_1
1 1 Orange Orange_1
2 1 Apple Apple_2
3 1 Apple Apple_3
4 2 Orange Orange_1
5 2 Orange Orange_2
6 2 Banana Banana_1
7 2 Banana Banana_2
8 2 Apple Apple_1
9 3 Pumpkin Pumpkin_1
10 3 Apple Apple_1
11 3 Banana Banana_1