首页 > 解决方案 > 具有“均值”和行列表的熊猫 groupby

问题描述

我有一个包含日期、名称和数字分数的数据框。我正在尝试使用 pd.groupby 创建一个新的 df ,其中包含每小时间隔内的数值平均值以及该小时内出现的所有名称的列表:

是)我有的:

日期 姓名 分数
1 小时 一种 5
小时 2 2
小时 2 C 6
小时 2 D 4

我想要的是:

小时 姓名 得分(平均)
1 一种 5
2 [B,C,D] 4

我知道我可以分别创建它们中的每一个

df.groupby([pd.Grouper(key="date",freq='60min')]).agg("mean")

或使用.apply(list)获取列表中的名称

但我想两者都做。有任何想法吗?数据可能非常大,所以最好解决方案有点快。谢谢!

标签: pythonpandaspandas-groupby

解决方案


如果每个值都需要列表,那么一个元素列表也可以GroupBy.agg与名称聚合一起使用:

df1 = (df.groupby([pd.Grouper(key="date",freq='60min')])
         .agg(Name = ("Name",list), Avg = ("Score","mean")))

或者:

df1 = (df.groupby(df["date"].dt.hour)
         .agg(Name = ("Name",list), Avg = ("Score","mean")))


print (df1)
           Name  Avg
date                
1           [A]    5
2     [B, C, D]    4

如果需要一个元素列表的标量需要自定义函数:

df1 = (df.groupby(df["date"].dt.hour)
        .agg(Name = ("Name",lambda x: list(x) if len(x)>1 else x), Avg = ("Score","mean")))
print (df1)
           Name  Avg
date                
1             A    5
2     [B, C, D]    4

最后用于Hours列:

df1 = df1.reset_index().rename(columns={"date":"Hours"})

推荐阅读