python - 如何按行对具有多个条件的熊猫数据框列进行求和
问题描述
我正在用 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
解决方案
我相信您需要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)
推荐阅读
- sql - 向表中添加多行,错误
- android - Android TV Input HAL EPG 支持和时移
- visual-studio-code - 无法使用来自 linux 子系统的 azure CLI 在 Azure VM 上执行“自定义脚本扩展”
- wpf - wpf DocumentViewer XPS捏以使用触摸进行缩放和滚动
- android - 继续使用数据绑定更新视图
- java - 方法不适用于数组的所有元素
- php - Laravel,我可以在发出 oauth 令牌(护照)后自动注销(或)清除会话吗
- data-collection - 一个作业的多个数据收集器,无需在流集中复制记录
- sql - 将所有选定的列合并为一列
- python - 多个标题,而我只想有一个标题