基于组和项目组枚举 Pandas 中的项目

问题描述

我有一个 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.cumcountSeries.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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...