如何按指定列合并行数据并将结果存储到新增同名列中
实现按指定列分组后将多行数据横向展开到新同名列
你要的同id多行数据横向扩展到同名列的效果,不需要把值拼接进原有列,核心是先给分组内的行打序号,再通过透视把不同序号的行值摊到新列即可,具体实现步骤如下:
- 首先导入pandas并构造原始测试数据
import pandas as pd df = pd.DataFrame({ 'id': [1,1,2,3,3,3], 'unit': ['m','kg','m','number','kg','m'], 'amount': [10,3,4,5,7,6] })
- 给每个id分组内的行添加从0开始的顺序计数,用来标识当前行是该id下的第几条数据
df['group_row_num'] = df.groupby('id').cumcount() - 做透视转换,调整列顺序保证unit和amount一一对应,最后重置索引得到结果
# 按id做行索引,分组内行号做列索引,提取unit和amount的值 result = df.pivot(index='id', columns='group_row_num', values=['unit', 'amount']) # 交换列层级、排序,保证unit和amount按顺序交替对应 result = result.swaplevel(axis=1).sort_index(axis=1) # 拍平列名,去掉序号层级,保留原列名得到重复同名列 result.columns = [col[1] for col in result.columns] # 把id从索引变回普通列 result = result.reset_index(drop=False)
运行后得到的输出如下,空值位置可以用result = result.fillna('')替换成空白,和你给出的示例格式完全一致:
id unit amount unit amount unit amount 0 1 m 10.0 kg 3.0 NaN NaN 1 2 m 4.0 NaN NaN NaN NaN 2 3 number 5.0 kg 7.0 m 6.0
注意:pandas默认不支持完全重名的列做后续计算,如果转换后还需要做数据处理,建议给列名加后缀区分(比如unit_1、amount_1、unit_2、amount_2),仅做导出展示的话保留同名列没有问题。
内容的提问来源于stack exchange,提问作者Maul Seil
相关产品推荐
相关产品推荐

