Python Pandas:如何统计数据框中每行特定值的出现次数?

4

I have a dataframe df:

domain               country     out1 out2 out3
oranjeslag.nl           NL          1    0   NaN    
pietervaartjes.nl       NL          1    1    0
andreaputting.com.au    AU          NaN  1    0 
michaelcardillo.com     US          0    0    NaN

我希望定义两列 sum_0 和 sum_1,并计算每行列(out1,out2,out3)中 0 和 1 的数量。因此,预期结果如下:
domain               country     out1 out2 out3   sum_0  sum_1
oranjeslag.nl           NL          1    0   NaN    1      1
pietervaartjes.nl       NL          1    1    0     1      2
andreaputting.com.au    AU          NaN  1    0     1      1
michaelcardillo.com     US          0    0    NaN   2      0

我有一个计算1的数量的代码,但是我不知道如何计算0的数量。

df['sum_1'] = df[['out_1','out_2','out_3']].sum(axis=1)

有人可以帮忙吗?

3个回答

9
你可以为每个条件调用sum函数,对于第一个条件,只需要在axis=1上直接使用sum即可。对于第二个条件,你可以将df与0进行比较,然后像之前一样调用sum函数:
In [102]:
df['sum_1'] = df[['out1','out2','out3']].sum(axis=1)
df['sum_0'] = (df[['out1','out2','out3']] == 0).sum(axis=1)
df

Out[102]:
                 domain country  out1  out2  out3  sum_0  sum_1
0         oranjeslag.nl      NL     1     0   NaN      1      1
1     pietervaartjes.nl      NL     1     1     0      1      2
2  andreaputting.com.au      AU   NaN     1     0      1      1
3   michaelcardillo.com      US     0     0   NaN      2      0

谢谢@EdChum!最终我使用了这个逻辑来计算在同一行的不同列中字符串出现的次数: df[['out1','out2','out3']].isin(df['out1']).sum(axis=1) - Charles Crous

5

我会做:

df["sum_0"] = df.apply(lambda row: sum(row[0:3]==0) ,axis=1)

我的敬意。我在循环中使用了解决方案,用参数替换了“sum_0”和“==0”,使我的工作在几分钟之前变成了几秒钟。Python的apply非常快速。 - kurp

1
也许自2015年以来,pandas已经改变了行为,但现在使用sum代码处理大于1的值时,它会产生这些值的实际总和,而不是它们的数量(这是我从问题中理解的,并且我也在寻找这个答案)。
df['sum_0'] = df[df == 0].count(axis=1)

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