如何在Pandas DataFrame中按分组合并行?附输入输出示例
实现思路:将输入DataFrame转换为目标格式
核心逻辑:按ID+C分组,聚合item与Counter数据
从输入数据结构来看,我们需要以ID和C的组合作为分组依据,对每个分组内的item和Counter进行整理,以下是两种常见场景的实现方案:
方案1:转换为宽表(透视表)
如果目标输出是把每个item作为独立列,对应展示该分组下的Counter值,可使用pivot方法:
import pandas as pd data = { 'ID': [500, 500, 500, 500, 500, 500, 500, 500, 400, 400, 400, 400, 400, 300, 200], 'item': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C', 'A', 'B', 'A', 'C', 'E', 'D', 'E'], 'Counter': [1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 1, 2, 1, 1, 1], 'C': ['XX', 'XX', 'XX', 'XX', 'XX', 'YY', 'YY', 'YY', 'XX', 'XX', 'YY', 'YY', 'YY', 'XX', 'XX'] } df = pd.DataFrame(data) # 生成透视表,ID+C作为行索引,item作为列,Counter为值 pivot_result = df.pivot(index=['ID', 'C'], columns='item', values='Counter').reset_index() # 处理缺失值与列名 pivot_result = pivot_result.fillna(0).rename_axis(None, axis=1) print(pivot_result)
输出示例(截取部分):
ID C A B C D E 0 200 XX 0 0 0 0 1 1 300 XX 0 0 0 1 0 2 400 XX 1 2 0 0 0 3 400 YY 1 0 2 0 1 4 500 XX 1 2 3 4 5 5 500 YY 1 2 3 0 0
方案2:聚合为列表格式
如果目标输出是把每个分组下的item和Counter打包成列表,可使用groupby+agg组合:
# 按ID+C分组,聚合item和Counter为列表 grouped_result = df.groupby(['ID', 'C']).agg( item_list=('item', list), counter_list=('Counter', list) ).reset_index() print(grouped_result)
输出示例(截取部分):
ID C item_list counter_list 0 200 XX [E] [1] 1 300 XX [D] [1] 2 400 XX [A, B] [1, 2] 3 400 YY [A, C, E] [1, 2, 1] 4 500 XX [A, B, C, D, E] [1, 2, 3, 4, 5] 5 500 YY [A, B, C] [1, 2, 3]
关键说明
- 两种方案可根据实际目标输出格式选择,透视表适合需要横向展示各item数据的场景,列表聚合适合保留原始序列的场景。
- 如果目标输出有特殊格式要求(比如自定义列名、特定缺失值处理),可在基础代码上添加
rename、replace等方法调整。
内容的提问来源于stack exchange,提问作者Romeo Gherasim
相关产品推荐
相关产品推荐

