跨多列的 Grouby 和 Sum [复制]

Grouby and Sum Across Multiple Columns [duplicate]

提问人:user603535 提问时间:11/14/2023 最后编辑:Goku - stands with Palestineuser603535 更新时间:11/15/2023 访问量:73

问:

如何在 DataFrame 中的多个列之间进行分组和求和,同时保留 DataFrame 的原始“外观”?这就是我的意思:

代码/数据:

import pandas as pd

df = pd.DataFrame({"State": ["NM", "NM", "NM", "TX", "TX", "TX", "TX", "TX"],
                   "County": ["Lea", "Lea", "Chaves", "Lamb", "Lamb", "Lubbock", "Lubbock", "Denton"],
                   "Name": ["Mike", "Mike", "Cash", "Mary", "Mary", "Addison", "Addison", "Jen"],
                   "Checking": [50, 100, 25, 1000, 360, 9, 100, 200],
                  "Savings": [100, 200, 75, 300, 300, 10000, 250, 75]})

print(df)

    State   County     Name  Checking  Savings
0      NM      Lea     Mike        50      100
1      NM      Lea     Mike       100      200
2      NM   Chaves     Cash        25       75
3      TX     Lamb     Mary      1000      300
4      TX     Lamb     Mary       360      300
5      TX  Lubbock  Addison         9    10000
6      TX  Lubbock  Addison       100      250
7      TX   Denton      Jen       200       75

这是我想要的输出。我省略了索引,因为我对它最终的显示方式无动于衷,只要我得到下面的结果。请注意,对于每个州、县和名称组合,我如何分别对“支票”和“储蓄”列求和。例如,NM -> Lea -> Mike 只有一行,其中 Checking 和 Savings 列具有与上述条件匹配的所有行的总和。

   State   County     Name  Checking  Savings
      NM      Lea     Mike       150      300
      NM   Chaves     Cash        25       75
      TX     Lamb     Mary      1360      600
      TX  Lubbock  Addison       109    10250
      TX   Denton      Jen       200       75

第一个挑战是按前三列分组,然后分别对最后两列求和。第二个挑战是让数组与这种格式相匹配,没有嵌套/多层索引或列。

谢谢!

python-3.x pandas group-by

评论


答:

0赞 Goku - stands with Palestine 11/14/2023 #1
import pandas as pd

df = pd.DataFrame({"State": ["NM", "NM", "NM", "TX", "TX", "TX", "TX", "TX"],
                   "County": ["Lea", "Lea", "Chaves", "Lamb", "Lamb", "Lubbock", "Lubbock", "Denton"],
                   "Name": ["Mike", "Mike", "Cash", "Mary", "Mary", "Addison", "Addison", "Jen"],
                   "Checking": [50, 100, 25, 1000, 360, 9, 100, 200],
                  "Savings": [100, 200, 75, 300, 300, 10000, 250, 75]})

print(df)

    State   County     Name  Checking  Savings
0      NM      Lea     Mike        50      100
1      NM      Lea     Mike       100      200
2      NM   Chaves     Cash        25       75
3      TX     Lamb     Mary      1000      300
4      TX     Lamb     Mary       360      300
5      TX  Lubbock  Addison         9    10000
6      TX  Lubbock  Addison       100      250
7      TX   Denton      Jen       200       75

您可以执行以下操作:

df.groupby(['State','County','Name']).agg(
     Checking = ('Checking','sum'),
     Savings = ('Savings','sum'),
     ).reset_index()

#output

enter image description here

评论

0赞 user603535 11/15/2023
感谢您的帮助!我不明白两个等号之前的“检查”和“储蓄”文本。它们在 agg 函数中做了什么,为什么它们不需要是字符串?例如,Checking = ('Checking','sum') 在做什么?
0赞 Goku - stands with Palestine 11/15/2023
实际上,它们是新的列名。您可以拥有任何列名。我保持不变
0赞 Goku - stands with Palestine 11/15/2023
@user603535请这个答案 stackoverflow.com/a/53619715/13086128
0赞 user603535 11/15/2023
你的第一个建议对我不起作用(也许是由于我的 Python 版本?),所以这就是为什么我有点困惑。果然,我四处搜索,偶然发现了您刚才建议的相同链接。非常感谢!
0赞 Goku - stands with Palestine 11/15/2023
如果你觉得答案有用,你可以+1✔️,这样其他堆栈成员就知道他是否发现和你一样的疑问。