如何按ID分组,汇总不同ID2对应的特征行求和并生成指定列?
解决方案
可以通过「计算行特征总和 → 分组聚合 → 转宽表」三步实现需求,具体代码如下:
1. 准备示例数据
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'ID': [2,2,1,2,2], 'ID2': [2,2,1,2,1], 'Feature1': [8,4,8,1,3], 'Feature2': [5,8,6,3,7], 'Feature3': [7,8,2,7,5], 'Feature4': [3,3,5,4,9], 'Feature5': [7,6,1,9,7] })
2. 计算每行的特征列总和
先把每行的Feature1到Feature5求和,得到单条数据的特征总价值:
# 筛选所有以Feature开头的列,按行求和 df['row_sum'] = df.filter(like='Feature').sum(axis=1)
3. 分组聚合并转宽表
按ID和ID2分组求和,再将ID2转为列(缺失的分组用0填充),最后调整列名:
方法一:groupby + unstack
# 按ID、ID2分组求和,unstack将ID2转为列,fill_value填充缺失值为0 grouped = df.groupby(['ID', 'ID2'])['row_sum'].sum().unstack(fill_value=0) # 重命名列 grouped.columns = ['Sum_ID2_values1', 'Sum_ID2_values2'] # 重置索引,让ID成为普通列 result = grouped.reset_index()
方法二:pivot_table(更直接的透视表方式)
# 用透视表聚合,index是ID,columns是ID2,values是行总和,aggfunc用sum,缺失值填0 result = pd.pivot_table( df, index='ID', columns='ID2', values='row_sum', aggfunc='sum', fill_value=0 ) # 重命名列并重置索引 result.columns = ['Sum_ID2_values1', 'Sum_ID2_values2'] result = result.reset_index()
最终输出
运行后得到的result即为预期格式:
ID Sum_ID2_values1 Sum_ID2_values2 0 1 22 0 1 2 31 83
关键说明
你之前尝试groupby或pivot_table未成功,大概率是没先计算每行的特征总和——需求是先把每行的所有特征加起来,再按ID+ID2分组求和,而非直接对特征列按组求和后合并。
内容的提问来源于stack exchange,提问作者Jim A
相关产品推荐
相关产品推荐

