如何用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的输出如下:
| Fruit | NumberForBob | |
|---|---|---|
| 0 | Apples | 7+8+1=16 |
| 1 | Oranges | 2+65=67 |
| 2 | Grapes | 1+22+12=35 |
| 3 | Melons | 0 |
关键点说明
- 左连接确保所有原始水果都被保留,不会因为Bob没有数据而丢失条目
- 自定义聚合函数
lambda x实现了计算过程字符串的拼接,同时计算总和 - 用
fillna('0')直接处理无Bob数据的情况,无需复杂的if判断
内容的提问来源于stack exchange,提问作者funcard
相关产品推荐
相关产品推荐

