我有以下数据框,我只想打印缺少值的列。
data = pd.DataFrame({'col_A' : [1,2,3,4],
'col_B' : [1,2,np.NaN,4]})
查找NaN的功能:
def num_missing(x):
return sum(x.isnull())
而没有条件的打印有效:
print( data.apply(num_missing, axis=0))
输出:
col_A 0
col_B 1
dtype: int64
期望的输出:
col_B 1
dtype: int64
我尝试使用一行if语句进行打印...但我的语法错误
print( data.apply(num_missing, axis=0) if data.apply(num_missing, axis=0)> 0)
我也尝试了下面的if语句,它不起作用:
if data.apply(num_missing, axis=0) >0:
print( data.apply(num_missing, axis=0) )
请您提供解决方案,并解释一下我做错了什么?
答案 0 :(得分:1)
IIUC我认为你需要这样的东西
data = pd.DataFrame({'col_A' : [1,2,3,4],
'col_B' : [1,2,np.NaN,4]})
#finding null values in columns and if atleat one null value is present printing it.
print(data.columns.values[data.isnull().any()])
['col_B']
试试这个
print(data.isnull().sum()[data.isnull().any()])
col_B 1
dtype: int64
对于OP
if data.apply(num_missing, axis=0)>0:
print('Yay')
由于行data.apply(num_missing, axis=0)>0
生成一系列而不是一个布尔值。如果对series
bool列使用if语句,则会将回溯抛出为:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-282-12bc35218d0e> in <module>()
----> 1 if data.apply(num_missing, axis=0)>0:
2 print('Yay')
~\AppData\Local\conda\conda\envs\py3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1119 raise ValueError("The truth value of a {0} is ambiguous. "
1120 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1121 .format(self.__class__.__name__))
1122
1123 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
上述if语句应与a.empty, a.bool(), a.item(), a.any() or a.all()
中的任何一个一起使用。所以,最后你会得到一个包含列数长度的布尔系列。这是多余的。所以最好使用上面提到的方法,而不是坚持if语句。
如果您仍想在if语句中执行。试试这个:
if (data.apply(num_missing, axis=0)>0).any():
print(data.apply(num_missing, axis=0)[data.apply(num_missing, axis=0)>0])
如果任何列中没有NaN值,那么它会有所帮助,否则if语句将是多余的。谢谢。