如果其他列等于特定值,则对列进行求和

3
我遇到的问题似乎不太复杂,但我很难找到一个好的方法来解决它。我需要做的就是从“P1”-“P5”中的数据创建一个新的数据框,并为每个ID汇总“分钟”列。我想到的唯一方法是创建5个不同的数据框(每个“P”列一个),将它们附加起来,然后使用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

数据无法复制,能否请提供一个可重现的示例。谢谢。 - anky
@anky_91 已修复,希望问题解决了。 - Nick
你能展示一下新的数据框吗,谢谢。这会更清楚地表达你想要什么。 - Hassan Voyeau
@Hassan Voyeau 已添加。我应该知道视觉上更有意义,而不是我试图解释。 - Nick
2个回答

4

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

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

这个解决方案将前五列“拉伸”成一个高列,并将其用于分组。根据%%timeit的测试结果,这个解决方案比你的(给定数据框)快两倍。


谢谢!我不熟悉“melt”函数,但希望避免使用循环,所以这非常完美。 - Nick

1
使用 wide_to_long
pd.wide_to_long(df.reset_index(),['P'],i=['Minutes','index'],j='drop').\
     reset_index(level=0).\
       groupby('P').\
         Minutes.\
            sum()
P
201143     29
202330     24
202681     28
202694     20
202954      1
203382     18
203935     25
1626179    26
1627759    27
1627824     2
1628369    28
1628400     2
1628464     5
Name: Minutes, dtype: int64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接