【问题标题】:Pandas Replace NaN with blank/empty stringPandas 用空白/空字符串替换 NaN
【发布时间】:2015-01-06 09:56:38
【问题描述】:

我有一个 Pandas 数据框,如下所示:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

我想用空字符串删除 NaN 值,使其看起来像这样:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:
    df = df.fillna('')
    

    或者只是

    df.fillna('', inplace=True)
    

    这将用'' 填充na(例如NaN)。

    如果要填充单列,可以使用:

    df.column1 = df.column1.fillna('')
    

    可以使用df['column1'] 代替df.column1

    【讨论】:

    • @Mithril - df[['column1','column2']] = df[['column1','column2']].fillna('')
    • 这是给我SettingWithCopyWarning
    • @jss367 这不是因为这段代码,而是因为您之前创建了一个较大 df 的局部视图。很好的答案stackoverflow.com/a/53954986/3427777
    • 我很好奇为什么str(np.nan) 不返回空字符串,这在我看来是合乎逻辑的结果。我敢肯定这与香肠厂的内部运作有关。谁能给我一个好的解释?
    【解决方案2】:
    import numpy as np
    df1 = df.replace(np.nan, '', regex=True)
    

    这可能会有所帮助。它将用空字符串替换所有 NaN。

    【讨论】:

    • np.nan 来自哪个库?我不能用它
    • @CaffeineConnoisseur: import numpy as np.
    • @CaffeineConnoisseur - 如果你不想import numpy 也可以直接使用pd.np.nan
    • 提及... inplace=True 选项也很有用。
    • @CaffeineConnoisseur,@elPastor - pandas 1.0.3 警告pandas.np 在未来版本中被弃用。很高兴拥有它!
    【解决方案3】:

    如果您正在从文件(例如 CSV 或 Excel)中读取数据框,请使用:

    df.read_csv(path , na_filter=False)
    
    df.read_excel(path , na_filter=False)
    

    这会自动将空字段视为空字符串''


    如果你已经有了数据框

    df = df.replace(np.nan, '', regex=True)
    
    df = df.fillna('')
    

    【讨论】:

    • na_filter 在 read_excel() 上不可用 pandas.pydata.org/pandas-docs/stable/…
    • 我在我的应用程序中使用过它。它确实存在,但由于某种原因,他们没有在文档中给出这个论点。它对我来说很好,但没有错误。
    • 它有效,我在解析中使用它xl.parse('sheet_name', na_filter=False)
    • 我翻遍了这么多不同的线程以进行修复,这是唯一适用于我的 CSV 文件的线程。谢谢。
    【解决方案4】:

    如果您只想对其进行格式化,以便在打印时呈现良好的效果,请使用格式化程序。只需使用df.to_string(... formatters 定义自定义字符串格式,无需不必要地修改您的 DataFrame 或浪费内存:

    df = pd.DataFrame({
        'A': ['a', 'b', 'c'],
        'B': [np.nan, 1, np.nan],
        'C': ['read', 'unread', 'read']})
    print df.to_string(
        formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})
    

    获得:

       A B       C
    0  a      read
    1  b 1  unread
    2  c      read
    

    【讨论】:

    • print df.fillna('') 本身(不做df = df.fillna(''))也不会修改原始文件。使用to_string 是否有速度或其他优势?
    • 很公平,df.fillna('') 是!
    • @shadowtalker:不一定,如果 OP 想要将 df 保持为一种格式(例如,计算效率更高,或在不必要/空/重复的字符串上节省内存),这才是正确的答案,但以更令人愉悦的方式在视觉上呈现它。在不了解用例的情况下,我们无法确定。
    【解决方案5】:

    试试这个,

    添加inplace=True

    import numpy as np
    df.replace(np.NaN, '', inplace=True)
    

    【讨论】:

    • 这不是一个空字符串,''' '不等价,虽然第一个被视为False,上面使用的值将被视为True。跨度>
    【解决方案6】:

    使用keep_default_na=False 应该可以帮助你:

    df = pd.read_csv(filename, keep_default_na=False)
    

    【讨论】:

      【解决方案7】:

      如果您将 DataFrame 转换为 JSON,NaN 将给出错误,因此在此用例中最好的解决方案是将 NaN 替换为 None
      方法如下:

      df1 = df.where((pd.notnull(df)), None)
      

      【讨论】:

        【解决方案8】:

        我尝试用 nan 处理一列字符串值。

        移除 nan 并填充空字符串:

        df.columnname.replace(np.nan,'',regex = True)

        移除 nan 并填充一些值:

        df.columnname.replace(np.nan,'value',regex = True)

        我也试过 df.iloc。但它需要列的索引。所以你需要再次查看表格。简单地上述方法减少了一个步骤。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-04
          相关资源
          最近更新 更多