在多个列中计数零

时间:2018-07-13 08:13:24

标签: python pandas numpy dataframe

我有一个pandas DataFrame,它有10列,包含0、1或NaN。这是一个类似于我的示例数据框。

id     col_1 col_2 col_3
'jk3'  1     1     NaN
'kp2'  1     1     1
'po0'  0     1     0
'in6'  NaN   0     1
'ml5'  1     NaN   0
'lj3'  1     0     NaN

我想添加另一列df['correct'],如果该行中存在False,则显示0,否则显示True

我通过将系列加在一起来进行尝试:

df['correct'] = df[df.col_1 + df.col_2 + col_3]

但是NaN确实是一个问题,并在应该是NaN的行中显示True

有什么办法可以实现它,以便输出?

id     col_1 col_2 col_3 correct
'jk3'  1     1     NaN   True
'kp2'  1     1     1     True
'po0'  0     1     0     False
'in6'  NaN   0     1     False
'ml5'  1     NaN   0     False
'lj3'  1     0     NaN   False

2 个答案:

答案 0 :(得分:1)

id是列的情况下使用:

df['correct'] = df.iloc[:, 1:].ne(0).all(axis=1)
#alternative solution
#df['correct'] = ~df.iloc[:, 1:].eq(0).any(axis=1)
print (df)
      id  col_1  col_2  col_3  correct
0  'jk3'    1.0    1.0    NaN     True
1  'kp2'    1.0    1.0    1.0     True
2  'po0'    0.0    1.0    0.0    False
3  'in6'    NaN    0.0    1.0    False
4  'ml5'    1.0    NaN    0.0    False
5  'lj3'    1.0    0.0    NaN    False

详细信息

首先用iloc使所有列都排在前面,而没有第一:

print (df.iloc[:, 1:])
   col_1  col_2  col_3
0    1.0    1.0    NaN
1    1.0    1.0    1.0
2    0.0    1.0    0.0
3    NaN    0.0    1.0
4    1.0    NaN    0.0
5    1.0    0.0    NaN

以不等于ne进行比较:

print (df.iloc[:, 1:].ne(0))
   col_1  col_2  col_3
0   True   True   True
1   True   True   True
2  False   True  False
3   True  False   True
4   True   True  False
5   True  False   True

最后检查每行all True s:

print (df.iloc[:, 1:].ne(0).all(axis=1))
0     True
1     True
2    False
3    False
4    False
5    False
dtype: bool

如果id是索引:

df['correct'] = df.ne(0).all(axis=1)
print (df)
       col_1  col_2  col_3  correct
id                                 
'jk3'    1.0    1.0    NaN     True
'kp2'    1.0    1.0    1.0     True
'po0'    0.0    1.0    0.0    False
'in6'    NaN    0.0    1.0    False
'ml5'    1.0    NaN    0.0    False
'lj3'    1.0    0.0    NaN    False

答案 1 :(得分:0)

检查df.count(),它给出数据帧的非空计数,然后您可以根据需要将其分配为true / false。