使用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
相关产品推荐
相关产品推荐

