首页 > 解决方案 > 如果其他列等于值,则对列求和

问题描述

我遇到的问题似乎并不太复杂,但我正在努力寻找解决问题的好方法。我需要做的就是从下面的数据创建一个新的数据框,总结“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

标签: pythonpandas

解决方案


我不确定融化数据框是否更有效,但至少它不涉及显式循环:

pd.melt(df, id_vars='Minutes', value_vars=df.columns[:-1])\
  .groupby('value')['Minutes'].sum()

该解决方案将前五列“拉伸”成一个高列,并将其用于分组。根据%%timeit,此解决方案的速度是您的两倍(对于给定的数据帧)。


推荐阅读