【问题标题】:Understanding Pandas grouby sum()理解 Pandas groupby sum()
【发布时间】:2020-05-12 17:05:49
【问题描述】:

我无法理解 sum() 在 groupby() 的情况下是如何工作的。 Official docs 说它计算值的总和,但我不知道如何:

df = pd.DataFrame({'A': [1, 1, 2, 1, 2],
               'B': [np.nan, 2, 3, 4, 5],
               'C': [1, 2, 1, 1, 2]},
               columns=['A', 'B', 'C'])

我不知道它是如何计算结果的,它肯定没有为每一行做 A+B+C。

【问题讨论】:

  • df = df.groupby('A').sum()
  • 我认为你按 B 分组,但你想要 A
  • 我都不想要。我想知道它的 sum() 是怎么做的。方法。
  • 我认为您缺少groupy 所做的,而不是sum()。你在找df.sum(axis='columns')吗?
  • 是的,在阅读了@Boendal 的回答后,我认为你是对的,我无法理解 groupby() 的作用

标签: python pandas pandas-groupby


【解决方案1】:

这可以通过比较以下 2 个数据帧来很好地理解:-

让数据框成为

df.groupby('B').sum()给了

同时,df.groupby('A').sum() 给出了

所以,groupby().sum() 的作用是,取 B 的一个元素,在 A 和 C 中添加相应的行元素,然后在 B 列中搜索该元素的重复。如果找到,则再次将 A 和 C 的对应值相加。如果没有找到,则跳到 B 列中的下一个元素。为了进一步说明,在上面的示例中,首先取 B = 2.0,其中 A = 1 和 C = 2。 2.0 在 B 列中没有重复,它现在移动到 B = 3.0,其中 A = 2 和 C = 1,依此类推。这是 groupby('B').sum() 的输出。另一方面,当 df.groupby('A') 完成时,它首先需要 A = 1。为此,相应的值为 B = NaN,C = 1。由于 1 在 A 列中重复,sumB = NaN + 2.0 + 4.0 = 6,sumC = 1 + 2 + 1 = 4。现在 A = 1 完成,它转到 A = 2。同样,对于 A = 2,sumB = 3.0 + 5.0 = 8,sumC = 1 + 2 = 3。这解释了 groupby('A') 完成时的输出。

对于您的问题,df.sum() 将给出所有 3 列的总和为

A   7.0
B   14.0
C   7.0

如果您想要逐行求和,请执行df.sum(axis = 1) 这会给

0   2.0
1   5.0
2   6.0
3   6.0
4   9.0

【讨论】:

    【解决方案2】:

    你的例子很糟糕,但让我解释一下。

    Groupby 是一种获取列的值并将所有相等的值合并在一起的操作。现在我们需要一个操作来处​​理其他列。因为随着合并程序需要知道如何处理它们。那将是操作总和。 (其他操作:均值、计数、...)

    在您的情况下,您在 B 中只有唯一值,因此没有 2 行合并在一起。因此,一个元素的总和是多少?正是元素。

    l = [3]
    print(sum(l)) # Output: 3
    

    这就是你的例子中发生的事情。

    这就是为什么@jezrael在评论中说你可能想做df = df.groupby('A').sum()

    输出将是:

         B  C
    A        
    1  6.0  4
    2  8.0  3
    

    如您所见,我们按 A 列分组。第 1 行和第 3 行相加,第 2 行和第 4 行相加。

    您可能正在寻找这个:

    df.sum()
    

    哪个输出:

    A     7.0
    B    14.0
    C     7.0
    

    或者@Andrea提到的这个:

    df.sum(axis=1)
    

    哪个输出:

    0    2.0
    1    5.0
    2    6.0
    3    6.0
    4    9.0
    

    但是我认为 Groupby 是实现你想要的错误的方法。

    【讨论】:

    • 我认为你对“非常糟糕的例子”是正确的。示例取自官方文档。但话又说回来,我看到大多数例子都令人困惑。
    猜你喜欢
    • 2017-03-16
    • 2019-09-29
    • 2016-12-23
    • 1970-01-01
    • 2022-11-20
    • 2018-10-07
    • 2019-04-09
    相关资源
    最近更新 更多