Python Pandas groupby如何计算均值、中位数、计数并提取对应state字段
Pandas按User分组聚合多指标的实现方案
你可以直接用groupby对象的agg()方法实现多列多指标的同时聚合,还能自定义输出的列名,无需多次分组拼接。
示例运行代码
首先导入依赖、构造原始DataFrame:
import pandas as pd d = {'User' : ['A', 'A', 'B', 'C', 'C', 'C'], 'time':[1,2,3,4,4,4], 'state':['CA', 'CA', 'ID', 'OR','OR','OR']} df = pd.DataFrame(data = d)
写法1(Pandas 0.25+ 推荐,逻辑更清晰)
直接通过命名聚合的方式指定结果列名、对应聚合的原列和聚合函数:
df_res = df.groupby('User', as_index=False).agg( avg_time=('time', 'mean'), median_time=('time', 'median'), state=('state', 'first'), user_count=('User', 'size') )
运行后输出的df_res完全符合你给出的预期结构。
写法2(兼容旧版本Pandas)
如果使用的Pandas版本低于0.25,不支持命名聚合,可以先通过字典指定聚合规则,再重命名列:
# 按规则聚合 agg_df = df.groupby('User', as_index=False).agg({ 'time': ['mean', 'median'], 'state': 'first', 'User': 'size' }) # 合并多层列索引并重命名为目标列名 agg_df.columns = ['User', 'avg_time', 'median_time', 'state', 'user_count'] df_res = agg_df
规则说明
groupby('User', as_index=False):指定按User列分组,同时保留User为普通列而非行索引,符合输出的结构要求- 同一列可以指定多个聚合函数,比如示例中
time列同时计算均值和中位数 - 同一个用户的
state值完全一致,所以用first/last/max/min等聚合函数效果相同,按需选择即可 size聚合函数会统计每个分组的行数,也就是每个User的出现次数
内容的提问来源于stack exchange,提问作者justanewb
相关产品推荐
相关产品推荐

