python - 如果其他列等于值,则对列求和
问题描述
我遇到的问题似乎并不太复杂,但我正在努力寻找解决问题的好方法。我需要做的就是从下面的数据创建一个新的数据框,总结“P1”-“P5”中每个 ID 的“分钟”列。我想出的唯一方法是创建 5 个不同的 df(每个“P”列 1 个),附加它们,然后使用 groupby 来获取分钟总数,但这似乎非常低效。
任何有关解决此问题的更好方法的想法将不胜感激。
原来的:
P1 P2 P3 P4 P5 Minutes
1627759 1628369 201143 202330 202681 7
1626179 1628369 202330 203382 203935 5
1627759 1628369 201143 202681 203382 5
1627759 201143 202681 202694 203935 5
1626179 1628369 201143 202330 203935 4
1626179 1627759 202681 202694 203382 4
1626179 1628369 202694 203382 203935 3
1626179 1627759 201143 202681 202694 2
1626179 1628464 202330 202694 203935 2
1627759 201143 202330 202681 202694 2
1628369 201143 202330 202681 203935 2
1626179 1627759 1628369 201143 202681 1
1626179 202330 202694 203382 203935 1
1626179 1627759 201143 202694 203935 1
1626179 1627824 1628400 1628464 202954 1
1626179 1628369 1628464 202330 203935 1
1626179 1627824 1628400 1628464 203935 1
1627759 202330 202681 202694 203382 0
预期结果:
P Minutes
1627759 27
1626179 26
1628369 28
201143 29
1628464 5
202330 24
1627824 2
202681 28
202694 20
1628400 2
203382 18
203935 25
202954 1
解决方案
我不确定融化数据框是否更有效,但至少它不涉及显式循环:
pd.melt(df, id_vars='Minutes', value_vars=df.columns[:-1])\
.groupby('value')['Minutes'].sum()
该解决方案将前五列“拉伸”成一个高列,并将其用于分组。根据%%timeit
,此解决方案的速度是您的两倍(对于给定的数据帧)。
推荐阅读
- nunit - 提升事件
> : 无法使用提供的参数引发事件 - javascript - 如何在闪亮中创建部分可编辑的数据表?
- python - Python 与主代码并行运行函数
- c# - 使用百分比创建对象动画
- java - 如何将 Maven 项目外部的文件添加到 ZIP 发行版?
- c# - 如何在 .net wpf 应用程序中支持来自精密触摸板的 2 指捏合/缩放手势?
- r - R:来自 e1071 预测的 svm 因“概率”参数设置而异
- python - Pandas:按项目在 DataFrame 中出现的次数过滤列
- python - 如何在不抓取文档本身的情况下从网页获取文件的下载链接?
- python-2.7 - 用于在树莓派上自动更改 crontab 启动的 Python 脚本