我有一个包含日期、姓名和数值分数的数据帧。我想用pd。Groupby创建一个新的df,其中包含数字在每小时间隔内的平均值,以及在该小时内出现的所有名字的列表:
What I have:
<表类>
日期
名称
得分
tbody><<tr>1小时 5 2小时 B 2 2小时 C 6 2小时 D 4 表类>
如果需要每个值的列表,也可以使用具有名称聚合的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"})