Pandas按ID分组聚合求和并生成自定义分类列技术问询
Pandas分组聚合生成自定义列方案
示例基础数据
import pandas as pd df = pd.DataFrame({ 'ID': ['1', '1', '1', '2', '2'], 'category': ['A', 'B', 'A', 'C', 'B'], 'length': [10, 20, 15, 5, 25], 'other_col': ['x', 'y', 'z', 'm', 'n'] # 需保留的非聚合列 })
基础需求实现:按ID分组生成分类求和列
核心思路是先按ID+category分组求和,再将category维度转为列(宽表),最后合并回原DataFrame,保留所有原列:
# 1. 分组求和并转宽表,空值填充0 agg_df = df.groupby(['ID', 'category'])['length'].sum().unstack(fill_value=0) # 2. 合并回原DataFrame result = df.merge(agg_df, on='ID', how='left')
输出结果中会新增A/B/C列,对应每个ID下该分类的length总和。
扩展需求实现
1. 自定义新列名称
在转宽表后重命名列即可:
agg_df = df.groupby(['ID', 'category'])['length'].sum().unstack(fill_value=0) # 自定义列名规则:前缀+分类名 agg_df.columns = [f'Custom_name_{col}' for col in agg_df.columns] result = df.merge(agg_df, on='ID', how='left')
2. 多维度(ID+date)分组聚合
先构造带date列的示例数据:
df_with_date = pd.DataFrame({ 'ID': ['1', '1', '1', '2', '2', '1'], 'date': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-01', '2024-01-02', '2024-01-02'], 'category': ['A', 'B', 'A', 'C', 'B', 'B'], 'length': [10, 20, 15, 5, 25, 30], 'other_col': ['x', 'y', 'z', 'm', 'n', 'p'] })
按ID+date分组后重复上述流程:
# 多维度分组求和转宽表,自定义列名 agg_df_date = df_with_date.groupby(['ID', 'date', 'category'])['length'].sum().unstack(fill_value=0) agg_df_date.columns = [f'Custom_name_{col}' for col in agg_df_date.columns] # 以ID和date为键合并 result_date = df_with_date.merge(agg_df_date, on=['ID', 'date'], how='left')
3. 保留非聚合列
上述merge操作默认会保留原DataFrame的所有列(包括other_col这类未参与聚合的列),无需额外处理。
常见无效代码说明
如果尝试用transform实现,只能生成单列的分组求和结果,无法拆分多个分类列:
# 无效代码:仅能生成每个ID+category对应的求和值,无法扩展为多列 df['sum_length'] = df.groupby(['ID', 'category'])['length'].transform('sum')
内容的提问来源于stack exchange,提问作者Diauro
相关产品推荐
相关产品推荐

