我想检查数据帧中某些(不是全部)列中的某些记录是否为空;要做到这一点,我想创建T / F字段,然后我需要分组。例如。如果我有一个字段'x',那么我想创建一个'x POPULATED'字段,依此类推。
在我的上下文中,null表示NaN,字符串'not available'或字符串'nan'。
我已经尝试过以下代码,但它不起作用 - 我得到了:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')
我的问题是:
我做错了什么?
有没有更好的方法来实现这个?甚至 如果有,我很确定有,我仍然喜欢 在我的代码中了解我做错了什么。
谢谢!
import numpy as np, pandas as pd
df=pd.DataFrame()
df['a']=np.arange(0,10)
df['b']='test'
df['c']='nothing to test here'
df.iloc[0,:]=np.nan
df.iloc[1,1]='not available'
df.iloc[2,1]='nan'
def checknull(x):
if pd.isnull(x) or x=='not available' or x=='nan':
return False
else:
return True
for c in ['a','b']:
df[c + 'populated'] = df.apply( lambda x: checknull(df[c]) , axis=1 )
答案 0 :(得分:1)
对于矢量化解决方案,需要isnull
并使用isin
进行掩码,然后按~
反转:
df1 = ~(df[['a','b']].isnull() | (df[['a','b']].isin(['not available','nan'])))
print (df1)
a b
0 False False
1 True False
2 True False
3 True True
4 True True
5 True True
6 True True
7 True True
8 True True
9 True True
上次使用join
add_suffix
将新列添加到原始列:
df = df.join(df1.add_suffix('populated'))
print (df)
a b c apopulated bpopulated
0 NaN NaN NaN False False
1 1.0 not available nothing to test here True False
2 2.0 nan nothing to test here True False
3 3.0 test nothing to test here True True
4 4.0 test nothing to test here True True
5 5.0 test nothing to test here True True
6 6.0 test nothing to test here True True
7 7.0 test nothing to test here True True
8 8.0 test nothing to test here True True
9 9.0 test nothing to test here True True
在原始代码中需要x[c]
代替df[c]
,因为请分别检查每一行:
for c in ['a','b']:
df[c + 'populated'] = df.apply( lambda x: checknull(x[c]) , axis=1 )
print (df)
a b c apopulated bpopulated
0 NaN NaN NaN False False
1 1.0 not available nothing to test here True False
2 2.0 nan nothing to test here True False
3 3.0 test nothing to test here True True
4 4.0 test nothing to test here True True
5 5.0 test nothing to test here True True
6 6.0 test nothing to test here True True
7 7.0 test nothing to test here True True
8 8.0 test nothing to test here True True
9 9.0 test nothing to test here True True