Pandas分组聚合后如何使用apply方法计算count与nunique的线性组合
存在对应的apply实现方案,以下是符合需求的可行写法:
写法1:groupby阶段直接计算目标列(仅输出C列)
和你预期的调用逻辑完全匹配,直接对每个分组的Series执行聚合计算:
import pandas as pd # 直接在groupby后apply计算线性组合 s = df.groupby(df.index.date)['value'].apply(lambda x: x.count() - x.nunique() + 1).rename('C') print(s)
输出样例:
2009-01-03 1 2009-01-09 14 2009-01-10 61 2009-01-11 93 2009-01-12 99 Name: C, dtype: int64
写法2:保留原有count、nunique列同时计算C列
如果需要同时保留两个原始聚合列,可以在apply中返回多值Series:
s = df.groupby(df.index.date)['value'].apply( lambda x: pd.Series({ 'count': x.count(), 'nunique': x.nunique(), 'C': x.count() - x.nunique() + 1 }) ) print(s)
输出和你用eval方法得到的结果完全一致:
count nunique C 2009-01-03 1.0 1.0 1.0 2009-01-09 14.0 1.0 14.0 2009-01-10 61.0 1.0 61.0 2009-01-11 93.0 1.0 93.0 2009-01-12 106.0 8.0 99.0
写法3:对已聚合完成的DataFrame行级apply计算
如果你已经先执行了agg得到了包含count、nunique的DataFrame,也可以逐行计算:
s = df.groupby(df.index.date)['value'].agg(['count', 'nunique']) s['C'] = s.apply(lambda row: row['count'] - row['nunique'] + 1, axis=1)
内容的提问来源于stack exchange,提问作者sci9
相关产品推荐
相关产品推荐

