如何在Pandas透视表中定义含两列参数的aggfunc并输出单列结果
解决方法:在Pandas中实现跨列聚合并返回指定单列
你的问题核心在于:pivot_table默认会对每个指定的values列单独应用聚合函数,但你的聚合逻辑需要同时用到dpd和balance两列,所以才会出现重复的两列结果。下面提供两种简洁的解决方案:
方案1:使用groupby.apply(更直观推荐)
groupby的apply方法可以直接接收整个分组的DataFrame,完美支持跨列计算,最后再将结果转为指定列名的DataFrame即可:
import pandas as pd import numpy as np df = pd.DataFrame({'team':['a','a'],'balance':[100,3],'dpd':[0,60]}) # 按team分组,计算逾期余额占比 dq_result = df.groupby('team').apply( lambda group: np.sum(np.where(group['dpd'] >= 30, group['balance'], 0)) / np.sum(group['balance']) ).to_frame('dqratio') print(dq_result)
输出结果:
dqratio team a 0.029126
方案2:调整pivot_table的参数
如果你坚持使用pivot_table,需要去掉values参数(或只指定任意一列,因为我们要用到整个分组的所有列),然后重命名结果列:
dq_result = df.pivot_table( index='team', aggfunc=lambda group: np.sum(np.where(group['dpd'] >= 30, group['balance'], 0)) / np.sum(group['balance']) ).rename(columns={'balance': 'dqratio'}) print(dq_result)
为什么原来的代码会返回两列?
你之前指定了values=['balance','dpd'],pivot_table会分别对balance和dpd列调用你的lambda函数。但你的lambda函数本质是读取整个分组的dpd和balance,不管传入的是哪一列,计算结果都相同,所以最终得到了重复的两列。
内容的提问来源于stack exchange,提问作者hyunwoo jeong
相关产品推荐
相关产品推荐

