Pandas - 尝试根据公共(public)键将来自多行的数据组合成一行

标签 pandas

我有以下格式的数据框:

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

我正在尝试将 cust_id 的所有销售数据放在一行中。有时同一个 cust_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

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

关于Pandas - 尝试根据公共(public)键将来自多行的数据组合成一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61643635/

相关文章:

python - Pandas 条件过滤器

python - 从 Pandas 数据框中的一组对中获取所有连接的组件

python-3.x - 显示多个满足特定条件的数据-PANDAS 中的问题

python - Query.all() 到 pandas 数据帧或没有 for 循环的列表

python - 使用 Pandas 在 Dataframe 列中查找紧密匹配的值索引

python - "Bin labels must be one fewer than the number of bin edges"通过 pd.qcut 重复后 = 'drop' kwarg

python - 添加一个可以将数值分为低中位数和高位数的列?

python - pandas 条件聚合

python - 删除 pandas 数据框中的重复项后替换特定列值

python - 在这种情况下如何从多个 csv 文件读取数据并生成报告?