正在检查熊猫的许多列中的NaN

问题描述 投票:0回答:2

我想根据给定的列是否包含NaN向我的数据框添加一个二进制列。

我已经尝试使用下面的代码来实现。

import pandas as pd

dat = pd.DataFrame({'A': [12,34,56,78, 23,None, None], 'B': [90,80,70,23,None, 78, None], 'C': [90,80,70,23,None, 78, None], 'D': [12,34,56,78, 23,None, None]})
dat['A1'] = dat['A'].isnull()
dat['B1'] = dat['B'].isnull()
dat['C1'] = dat['C'].isnull()
dat['ismissing'] = 1 if dat['A1'] == True and dat['B1'] == True and dat['C1'] == True else 0
dat

但是我在上一行之前遇到了ValueError。

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

样本输入:

A     B     C     D
10   NaN    40    NaN
NaN  NaN    80    90
20    45    NaN   89
NaN  NaN    NaN   46

预期输出:

A     B     C     D     E
10   NaN    40    NaN   0
NaN  NaN    80    90    0
20    45    NaN   89    0
NaN  NaN    NaN   46    1

我只想检查A,B,C列的NaN。

python pandas dataframe nan
2个回答
0
投票

请注意,and需要单个布尔变量,而pd.Series不是。这就是为什么python抱怨它不知道如何将pd.Series转换为布尔值。

相反,您可以(并且应该)做:

df['ismissing'] = df[['A','B','C'']].isna().any(axis=1)

0
投票

您可以这样做:

In [1706]: dat['D'] = np.where(dat.isnull().apply(lambda x: all(x), axis=1), 1, 0)                                                                                                                          

    In [1707]: dat                                                                                                                                                                                              
    Out[1707]: 
          A     B     C  D
    0  12.0  90.0  90.0  0
    1  34.0  80.0  80.0  0
    2  56.0  70.0  70.0  0
    3  78.0  23.0  23.0  0
    4  23.0   NaN   NaN  0
    5   NaN  78.0  78.0  0
    6   NaN   NaN   NaN  1
© www.soinside.com 2019 - 2024. All rights reserved.