You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:24:25