如何在Pandas聚合中同时使用mean与nth(0)方法?
Pandas聚合时同时使用mean和nth函数的正确实现
原始代码与报错
以下是初始尝试的聚合代码:
import pandas as pd import numpy as np df = pd.DataFrame({ 'a' : [1,1,1,1], 'b' : [1,2,3,4], 'c' : [np.nan,6,7,8], }) r = df.groupby('a').agg({ 'b' : 'mean', 'c' : 'nth(0)', })
运行后触发报错:
AttributeError: 'SeriesGroupBy' object has no attribute 'nth(0)'
需求说明
原本想使用first方法,但它会自动返回第一个非空值,实际需要保留分组后列c的第一个原始值(包括空值),同时对列b计算均值。
已知以下写法可行,但不够优雅:
df.groupby('a').agg({ 'b' : 'mean', 'c' : lambda s:s.iloc[0], })
优雅解决方案
可以通过两种符合Pandas语法规范的方式实现:
方式1:元组形式指定函数与参数
这是最简洁的写法,直接用元组传递聚合函数名和对应参数:
df.groupby('a').agg({ 'b': 'mean', 'c': ('nth', 0) })
方式2:用functools.partial绑定参数
如果需要更灵活的参数控制,可借助partial绑定函数参数:
from functools import partial df.groupby('a').agg({ 'b': 'mean', 'c': partial(pd.Series.nth, n=0) })
效果验证
两种方式运行后,均得到预期结果:
b c a 1 2.5 NaN
既保留了列c的第一个空值,也正确计算了列b的均值。
内容的提问来源于stack exchange,提问作者Dario Colombotto
相关产品推荐
相关产品推荐

