python - 具有“均值”和行列表的熊猫 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)
获取列表中的名称
但我想两者都做。有任何想法吗?数据可能非常大,所以最好解决方案有点快。谢谢!
解决方案
如果每个值都需要列表,那么一个元素列表也可以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"})
推荐阅读
- typescript - 保证“接口”的未来属性不会具有特定类型的值
- java - 预计至少有 1 个 bean 有资格作为 autowire 候选者。依赖注解
- python - 如何创建一个 2 字命令 discord.py?
- gitlab-ci - gitlab ci 中的 Maven/gradle release-plugin 身份验证
- javascript - 是否可以连续排队返回承诺的函数数组?
- java - findsecbugs 报告导入库代码段漏洞的原因
- vba - 提高在 MS-Access 中对大型数据集计算 7 天滚动平均值的查询的性能
- r - 用 Lasso 回归系数找到线性模型
- django - DoesNotExist at /api/users 标记匹配查询在 Django rest api 中不存在
- python - dask 安装错误:ImportError:无法导入名称“计算”