【问题标题】:Pandas opposite of fillna(0)fillna 对面的熊猫(0)
【发布时间】:2015-10-20 23:27:08
【问题描述】:

df.fillna(0) 用 0 填充所有 NA/NaN 值,是否有一个函数可以将所有 non-NA/NaN 值替换为另一个值,例如 1?

如果我的 DataFrame 中的值是可变长度列表,那么:

  • df.replace() 要求列表长度相同
  • 布尔索引如df[len(df) > 0] = 1 抛出ValueError: cannot insert True, already exists
  • pandas.get_dummies() 抛出 TypeError: unhashable type: 'list'

有没有更直接的解决方案?

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    我不知道内置函数,但它有效:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(data={'a':[np.nan, 13, 32]})
    
     >>    a
       0  NaN
       1   13
       2   32
    
    df = df.applymap(lambda x: 1 if not np.isnan(x) else x)
    
     >>     a
        0 NaN
        1   1
        2   1
    

    【讨论】:

    • 我不得不使用类似isinstance(x, list) 而不是numpy.isnan(x) 来防止获得TypeError,但使用lambda 函数确实可以解决问题。
    【解决方案2】:

    您可以对df[df.notnull()] = 1 使用索引/赋值。例如:

    >>> df = pd.DataFrame([[np.nan, 2, 5], [2, 5, np.nan], [2, 5, np.nan]])
    >>> df # example frame
        0  1   2
    0 NaN  2   5
    1   2  5 NaN
    2   2  5 NaN
    
    >>> df[df.notnull()] = 1
    >>> df
        0  1   2
    0 NaN  1   1
    1   1  1 NaN
    2   1  1 NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2017-01-04
      • 2022-01-25
      • 2018-03-16
      • 2021-01-18
      相关资源
      最近更新 更多