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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:24:23