Pandas多重分组和条件求和

3

我有以下表格:

    A   B   C   D
75987   1   0   0
75987   1   1   1
75987   2   1   1
75987   2   2   1
75987   2   6   4
75987   1   6   2
75987   1   6   1
59221   2   18  4
59221   1   18  0
59221   2   18  1

我正在尝试根据以下条件创建E列:

  1. 按A和B列进行分组;
  2. 当C列小于或等于6时,对应的D列数值相加;
  3. 将这些相加后的值分配给E列。

我期望E列中的值如下所示:

   A    B   C   D   E
75987   1   0   0   4
75987   1   1   1   4
75987   2   1   1   6
75987   2   2   1   6
75987   1   6   2   4
75987   1   6   1   4
75987   2   6   4   6
59221   2   18  4   0
59221   1   18  0   0
59221   2   18  1   0

有建议在本论坛上如何实现groupby、布尔索引和.query等方法来解决类似问题,但我似乎无法适应它们以使其按预期工作。例如这里,但我也尝试了很多其他方法。

我的下面的尝试似乎是合乎逻辑的,但我仍然遇到了困难。

df['E'] = np.where(df.groupby(['A','B'])['C'] <= 6, ['D'].transform('sum'))

1个回答

4
这里有一种方法可以解决问题,与您尝试的方法类似。思路是将D列中的数值在C列超过6的行中替换为0,然后使用groupby.transformsum函数。
df['E'] = (
    df['D'].where(df['C'].le(6), other=0)
      .groupby([df['A'], df['B']])
      .transform(sum)
)
print(df)
#        A  B   C  D  E
# 0  75987  1   0  0  4
# 1  75987  1   1  1  4
# 2  75987  2   1  1  6
# 3  75987  2   2  1  6
# 4  75987  2   6  4  6
# 5  75987  1   6  2  4
# 6  75987  1   6  1  4
# 7  59221  2  18  4  0
# 8  59221  1  18  0  0
# 9  59221  2  18  1  0

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