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

使用groupby与sum()时保留Pandas DataFrame其他列的方法

解决Pandas按分组求和并保留固定列的问题

你这个需求很典型,核心就是按name分组后对指定列求和,同时保留每个name对应的唯一附属列值,我给你两种简单可靠的实现方法:

方法一:使用groupby.agg()指定列聚合规则

这是最直接的方式,通过字典明确每一列要使用的聚合函数:

import pandas as pd

# 构造你的示例DataFrame
df = pd.DataFrame({
    'name': ['Jack', 'Jack', 'Luke', 'Mark', 'Luke'],
    'value1': [1, 1, 0, 0, 1],
    'value2': [1, 2, 1, 1, 0],
    'otherstuff1': [1.19, 1.19, 1.08, 3.45, 1.08],
    'otherstuff2': [2.39, 2.39, 1.08, 3.45, 1.08]
})

# 分组聚合:value1/value2求和,otherstuff列取第一个值(因同一name值唯一,first/last/max都可)
newdf = df.groupby('name').agg(
    value1=('value1', 'sum'),
    value2=('value2', 'sum'),
    otherstuff1=('otherstuff1', 'first'),
    otherstuff2=('otherstuff2', 'first')
).reset_index()

print(newdf)

代码说明:

  • groupby('name'):按姓名分组
  • agg()里的参数是**列名: (原列名, 聚合函数)**的形式,清晰指定每列的处理逻辑
  • 因为你提到同一name对应的otherstuff1和otherstuff2值始终相同,所以用first/last/max/min都能正确拿到唯一值
  • reset_index():把分组后的name从索引变回普通列,符合你想要的结果格式

方法二:拆分处理后合并(适合复杂场景)

如果后续需要单独调整求和或附属列的逻辑,可以拆分两步处理再合并:

# 第一步:对value1和value2分组求和
sum_values = df.groupby('name')[['value1', 'value2']].sum().reset_index()

# 第二步:提取每个name对应的唯一otherstuff数据(去重)
other_info = df[['name', 'otherstuff1', 'otherstuff2']].drop_duplicates()

# 第三步:通过name列合并两个DataFrame
newdf = pd.merge(sum_values, other_info, on='name')

代码说明:

  • 先单独处理求和部分,逻辑更清晰
  • drop_duplicates()确保每个name只保留一行附属列数据
  • pd.merge()通过共同的name列拼接结果,和方法一效果完全一致

最终输出结果:

两种方法都会得到你期望的newdf:

name  value1  value2  otherstuff1  otherstuff2
0   Jack       2       3         1.19         2.39
1   Luke       1       1         1.08         1.08
2   Mark       0       1         3.45         3.45

内容的提问来源于stack exchange,提问作者SwagZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:21