熊猫用空白/空字符串替换NaN


216

我有一个Pandas Dataframe,如下所示:

    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

Answers:


260
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

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


1
什么图书馆np.nan来自哪里?我不能使用它
CaffeineConnoisseur

8
@CaffeineConnoisseur :import numpy as np
John Zwinck

26
@CaffeineConnoisseur-或者只是pd.np.nan如果您不想这样做import numpy
elPastor

1
这也允许将Dict保存为.csv行中的字符串,然后使用pd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
提及该... inplace=True选项也很有用。
smci

338
df = df.fillna('')

要不就

df.fillna('', inplace=True)

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

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

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

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


5
@Mithril-– df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

如果要从文件(例如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('')


我已经在我的应用程序中使用过它。它确实存在,但是由于某些原因,他们没有在文档中给出这个参数。它对我来说很好,尽管没有错误。
Natesh bhat

它有效,我在解析中使用它xl.parse('sheet_name', na_filter=False)
Dmitrii

5

如果只想格式化它,以使其在打印时呈现良好,请使用格式化程序。只需使用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

4
print df.fillna('')本身(不执行df = df.fillna(''))也不会修改原始内容。使用有速度或其他优势to_string吗?
惊人的

足够公平,df.fillna('')是!
史蒂夫·舒利斯特

@shadowtalker:不一定,只有当OP希望将df保持一种格式(例如,计算效率更高,或将内存保存在不必要/空/重复的字符串上),而又以更直观的方式呈现时,这才是正确的答案令人愉快的方式。在不了解用例的情况下,我们不能肯定地说。
smci

2

试试这个,

inplace=True

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

1

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

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


0

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

要删除nan并填充空字符串,请执行以下操作:

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

要删除nan并填充一些值:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.