DataFrame按两列分组计算另外两列均值时遇元组报错求解决
解决Pandas多列分组并计算多列均值的问题
先看你的原始DataFrame数据:
import pandas as pd # 你的DataFrame示例 df_Done_Avg_Salesperson_Volume = pd.DataFrame({ 'state': ['Done', 'Done', 'Done', 'Done', 'Done'], 'currency_str': ['USD', 'USD', 'USD', 'GBP', 'GBP'], 'sales_person_name2': ['AY', 'AY', 'AY', 'YJJ', 'YJJ'], 'rfq_qty': [200000.0, 1000000.0, 200000.0, 25000000.0, 2500000.0], 'rfq_qty_CAD_Equiv': [155720.0, 778600.0, 155720.0, 14140000.0, 1946500.0] })
你想要按sales_person_name2和currency_str分组,计算rfq_qty和rfq_qty_CAD_Equiv的均值,期望得到这样的结果:
sales_person_name2 currency_str Avg rfq_qty Avg rfq_qty_CAD_Equiv AY USD 466666.6667 363346.6667 YJJ GBP 13750000.0000 8043250.0000
你之前的代码出错是因为字典语法完全错误,你写的d = { ('rfq_qty',np.mean) ('rfq_qty_CAD_Equiv',np.mean) }不符合Python字典的键值对格式,这才触发了tuple object is not callable的报错。
下面给你两种正确的实现方式:
方法一:自定义列名的灵活聚合
这种方式可以直接指定每列的聚合规则,还能自定义结果列的名称:
import numpy as np # 定义聚合规则:键为原列名,值为(新列名, 聚合函数) agg_rules = { 'rfq_qty': ('Avg rfq_qty', np.mean), 'rfq_qty_CAD_Equiv': ('Avg rfq_qty_CAD_Equiv', np.mean) } # 执行分组聚合并重置索引 result = df_Done_Avg_Salesperson_Volume.groupby( ['sales_person_name2', 'currency_str'] ).agg(agg_rules).reset_index() display(result)
方法二:简洁的批量均值计算
如果所有目标列都用同一种聚合函数(这里是均值),可以用更简洁的写法,之后再统一重命名列:
# 分组计算均值 result = df_Done_Avg_Salesperson_Volume.groupby( ['sales_person_name2', 'currency_str'] )[['rfq_qty', 'rfq_qty_CAD_Equiv']].mean().reset_index() # 重命名列以匹配期望格式 result.columns = [ 'sales_person_name2', 'currency_str', 'Avg rfq_qty', 'Avg rfq_qty_CAD_Equiv' ] display(result)
这两种方法都能得到你想要的结果,第一种适合需要给不同列指定不同聚合函数或自定义列名的场景,第二种适合批量处理同类型聚合的情况。
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

