【问题标题】:Print based on one line condition when applying a function to a data frame Python将函数应用于数据框Python时基于一行条件打印
【发布时间】:2018-04-05 09:36:13
【问题描述】:

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

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

您能否提供解决方案并解释我做错了什么?

【问题讨论】:

    标签: python pandas if-statement printing apply


    【解决方案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 语句将是多余的。谢谢。

    【讨论】:

    • 是的,但这不会给出丢失的数量。 + 我想了解 if one line 语句。
    • @A.Papa 我已经更新了。如果知道这对您有用,请检查并告诉我。
    • 嗨 Sandeep,这确实有效。知道我应该如何对其进行编码以使用 if 语句吗?
    • Thnaks @Sandeep Kadapa,您的解决方案要快得多!
    • @A.Papa 很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-04-20
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多