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

如何用Pandas获取列唯一值并对指定用户的对应列求和?

问题:按水果统计Bob的数值总和(无对应数据填0)

参考Stack Overflow帖子《How do I Pandas group-by to get sum?》后仍未解决问题,现有如下DataFrame:

import pandas as pd

df = pd.DataFrame({
    'Fruit': ['Apples', 'Apples', 'Apples', 'Apples', 'Apples',
              'Oranges', 'Oranges', 'Oranges', 'Oranges', 'Oranges',
              'Grapes', 'Grapes', 'Grapes', 'Grapes', 'Grapes',
              'Melons'],
    'Name': ['Bob', 'Bob', 'Mike', 'Steve', 'Bob',
             'Bob', 'Tom', 'Mike', 'Bob', 'Tony',
             'Bob', 'Tom', 'Bob', 'Bob', 'Tony',
             'Mike'],
    'Number': [7, 8, 9, 10, 1, 2, 15, 57, 65, 1, 1, 87, 22, 12, 15, 10]
})

需要生成新DataFrame:

  • 第一列为原Fruit列所有唯一值
  • 第二列为Bob对应水果的Number求和,无数据则填0,同时显示计算过程(如7+8+1=16)

期望输出:

Fruit    NumberForBob
Apples     7+8+1=16
Oranges     2+65=67
Grapes     1+22+12=35
Melons     0

尝试用if语句结合groupby未得到结果,求实现方法。


解决方案

可以通过筛选Bob数据+分组聚合+左连接补全三步实现,既保留所有水果,又生成带计算过程的结果:

1. 筛选Bob的数据并分组生成计算字符串

先提取Bob的行,按Fruit分组后,拼接数值字符串并计算总和:

# 过滤出Bob的记录
bob_records = df[df['Name'] == 'Bob']

# 分组聚合:生成计算过程字符串和总和
bob_agg = bob_records.groupby('Fruit').agg(
    calc_detail=('Number', lambda x: f"{'+'.join(map(str, x))}={x.sum()}")
).reset_index()

2. 补全所有水果并填充0

获取原数据中所有唯一水果,和Bob的聚合结果做左连接,缺失值直接填0:

# 获取所有不重复的水果
all_fruit_list = pd.DataFrame({'Fruit': df['Fruit'].unique()})

# 左连接保留所有水果,填充无Bob数据的项为0
final_result = all_fruit_list.merge(
    bob_agg, 
    on='Fruit', 
    how='left'
).rename(columns={'calc_detail': 'NumberForBob'})

final_result['NumberForBob'] = final_result['NumberForBob'].fillna('0')

最终结果

执行后final_result的输出如下:

FruitNumberForBob
0Apples7+8+1=16
1Oranges2+65=67
2Grapes1+22+12=35
3Melons0

关键点说明

  • 左连接确保所有原始水果都被保留,不会因为Bob没有数据而丢失条目
  • 自定义聚合函数lambda x实现了计算过程字符串的拼接,同时计算总和
  • 用fillna('0')直接处理无Bob数据的情况,无需复杂的if判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:20:35