将函数应用于数据框Python

时间:2018-04-05 09:36:13

标签: python pandas if-statement printing apply

我有以下数据框,我只想打印缺少值的列。

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) )

请您提供解决方案,并解释一下我做错了什么?

1 个答案:

答案 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语句将是多余的。谢谢。