首页 > 解决方案 > 如何按行对具有多个条件的熊猫数据框列进行求和

问题描述

我正在用 pandas 翻译一个 excel 公式。其中具有指定条件的列按行计算和汇总。如果所选列中的单元格满足给定条件,我必须按行计数,然后添加满足条件的计数。

我有数据框:

东风:

a    b     c
14   x1    2
17   x2    2
0    x,1   3
1    x1    1

Excel公式:

= COUNTIFS($U2,14,$X2,"x2",$W2,2)+COUNTIFS($U2,17,$X2,"x2",$W2,2)+COUNTIFS(U2,14,$X2,"x1",$W2,2)

熊猫公式:

df['counted'] = (df[(df['a']==14) & (df['b']=='x2') & (df['c']==2)].count(axis=1)) + (df[(df['a']==17) & (df['b']=='x2') & (df['c']==2)].count(axis=1)) + (df[(df['a']==14) & (df['b']=='x1') & (df['c']==2)].count(axis=1))

我从我的 pandas 公式中得到以下结果: df:

a    b     c   counted
14   x1    2      NaN
17   x2    2      NaN
0    x,1   3      NaN
1    x1    1      NaN

预期结果如下图所示。任何帮助获得正确的公式将不胜感激。

预期结果df:

a    b     c   counted
14   x1    2      0
17   x2    2      1
0    x,1   3      0
1    x1    1      0

标签: pythonpandas

解决方案


我相信您需要sum将布尔掩码转换为整数:

a = (df['a']==14) & (df['b']=='x2') & (df['c']==2)
b = (df['a']==17) & (df['b']=='x2') & (df['c']==2)
c = (df['a']==14) & (df['b']=='x1') & (df['c']==2)

避免重复以获得更好的性能也是可能的链条件:

m1 = df['a']==14
m2 = df['b']=='x2'
m3 = df['c']==2
m4 = df['a']==17
m5 = df['b']=='x1'

a = m1 & m2 & m3
b = m4 & m2 & m3
c = m1 & m5 & m3

df['counted'] = a.astype(int)+ b.astype(int) + c.astype(int)
print (df)
    a    b  c  counted
0  14   x1  2        1
1  17   x2  2        1
2   0  x,1  3        0
3   1   x1  1        0

或按位链接掩码OR,然后转换为整数:

df['counted'] = (a | b | c).astype(int)

推荐阅读