用NaN替换pandas数据框中的空值

9

我有一个包含空单元格的数据框,希望将这些空单元格替换为NaN。

之前在论坛上提出的解决方案可以解决包含空格的情况:

df.replace(r'\s+',np.nan,regex=True)

但是当单元格为空时,此代码无法工作。是否有人有建议使用pandas代码来替换空单元格。


1
尝试使用 df.replace(r'\s*',np.nan,regex=True) - EdChum
其实我的建议有点过于激进了,这会将所有的str设置为NaN,请给我一点时间。 - EdChum
我认为最简单的方法是分两步完成,可以写成一行代码:df.replace(r'\s+',np.nan,regex=True).replace('',np.nan) - EdChum
4个回答

10

我认为这里最简单的方法是进行两次替换:

In [117]:
df = pd.DataFrame({'a':['',' ','asasd']})
df

Out[117]:
       a
0       
1       
2  asasd

In [118]:
df.replace(r'\s+',np.nan,regex=True).replace('',np.nan)

Out[118]:
       a
0    NaN
1    NaN
2  asasd

1
请注意,此解决方案并不总是有效的。在我的情况下,它无法处理字符串“2015-09-02 06:13:40”,即将该值转换为NaN(这不应该发生)。检查字符串中是否有更多字符:.replace(r'\s+( +\.)|#',np.nan,regex=True).replace('',np.nan)) - Guido
在我的情况下,df.replace(r'\s+',np.nan,regex=True).replace('',np.nan) 把所有行(包括非空行)都替换成了 NaN! - mOna

4

( +\.)|# 是什么意思?顺便说一句,它运行得很好。 - Plasma
只是好奇,你为什么要使用 |#?这将我的数据框中所有的十六进制颜色 #000000 替换为 NaN。毕竟数据框中不可能有注释...更有可能是用于绘图的颜色。 - Claudiu Creanga

3
这个怎么样?
df.replace(r'\s+|^$', np.nan, regex=True)

2

正如你已经看到的那样,如果你按照显而易见的方式使用replace()并将其替换为None,它会抛出一个错误:

df.replace('', None)
TypeError: cannot replace [''] with method pad on a DataFrame

解决方案似乎是将空字符串替换为NumPy的NaN。
import numpy as np
df.replace('', np.NaN)

虽然我不能百分之百确定在所有边缘情况下pd.NaN与np.NaN处理方式完全相同,但我没有遇到任何问题。fillna()函数可以正常工作,在数据库中用NULL代替np.NaN也可以正常工作,并且将NaN保存到csv文件中也可以正常工作。

(Pandas版本18.1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接