我想根据给定的列是否包含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。
请注意,and
需要单个布尔变量,而pd.Series
不是。这就是为什么python抱怨它不知道如何将pd.Series
转换为布尔值。
相反,您可以(并且应该)做:
df['ismissing'] = df[['A','B','C'']].isna().any(axis=1)
您可以这样做:
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