Pandas-尝试基于公共键将多行数据合并到一行中

Pandas-尝试基于公共键将多行数据合并到一行中,pandas,Pandas,我有以下格式的数据帧: cust_id, sales 101, apple:1 101, banana:2 102, apple:1 103, apple:3 103, banana:5 103, apple:7 我试图将所有销售数据按客户id放在一行中。有时,同一客户id也可以对同一产品进行多次销售。对于这些条目,我希望创建一个新列 这就是我期望最终输出的方式: cust_id, apple, banana, apple 101, 1, 2 102, 1, 103, 3, 5, 7 您需要

我有以下格式的数据帧:

cust_id, sales
101, apple:1
101, banana:2
102, apple:1
103, apple:3
103, banana:5
103, apple:7
我试图将所有销售数据按客户id放在一行中。有时,同一客户id也可以对同一产品进行多次销售。对于这些条目,我希望创建一个新列

这就是我期望最终输出的方式:

cust_id, apple, banana, apple
101, 1, 2
102, 1,
103, 3, 5, 7

您需要将
sales
列拆分为多个列。使用
groupby.cumcount
分离重复的名称,并使用
pd.crosstab
获得最终结果

df1 = df.set_index('cust_id').sales.str.split(':', expand=True)
s = df1.groupby(['cust_id', 0]).cumcount().astype(str).replace('0','')
df_final = pd.crosstab(df1.index, df1[0]+s, df1[1], aggfunc='first')

Out[111]:
col_0 apple apple1 banana
row_0
101       1   None      2
102       1   None   None
103       3      7      5

注意:数据透视表总是对列名进行排序,因此输出数据框的列名已排序

鉴于预期的最终输出包括两个同名的列(apple和apple),您对此有首选解决方案吗?例如苹果1号,苹果2号。我这样问是因为Pandas不喜欢有多个同名列。@IanLogie,我希望它有相同的标签,但有前缀也不会有什么坏处。。所以有苹果1和苹果2这样的标签也可以。。