在pandas中将空白值(空格)替换为NaN
在pandas中将空白值(空格)替换为NaN
我想找到 Pandas 数据框中所有包含空格(任意数量)的值,并将这些值替换为 NaN。
有什么好的想法吗?
基本上,我想把这个:
A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz 2000-01-05 -0.222552 4 2000-01-06 -1.176781 qux
转换成这个:
A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN
我已经用下面的代码做到了,但是它太丑了。它不是 Python 的风格,我相信它也不是使用 Pandas 的最有效方法。我循环遍历每个列,并针对应用一个函数生成的列掩码进行布尔替换,该函数在每个值上执行正则表达式搜索,在空格上进行匹配。
for i in df.columns: df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
通过仅迭代可能包含空字符串的字段,可以稍微优化一下代码:
if df[i].dtype == np.dtype('object')
但这并没有太大改善
最后,这段代码将目标字符串设置为 None,这可以使用 Pandas 的函数(如 fillna()
)正常工作,但是如果我能直接插入 NaN
而不是 None
,那会更好。
admin 更改状态以发布 2023年5月21日
如果您想替换空字符串和仅包含空格的记录,则正确的答案是!:
df = df.replace(r'^\s*$', np.nan, regex=True)
被接受的答案
df.replace(r'\s+', np.nan, regex=True)
不能替换空字符串!你可以使用稍微更新的示例自己尝试:
df = pd.DataFrame([ [-0.532681, 'foo', 0], [1.490752, 'bar', 1], [-1.387326, 'fo o', 2], [0.814772, 'baz', ' '], [-0.222552, ' ', 4], [-1.176781, 'qux', ''], ], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))
请注意,即使它包含一个空格,'fo o' 也不会被替换为 NaN。
需进一步注意的是,一个简单的:
df.replace(r'', np.NaN)
也不起作用——试试吧。
我认为 df.replace()
可以胜任,因为自从 pandas 0.13 开始:
df = pd.DataFrame([ [-0.532681, 'foo', 0], [1.490752, 'bar', 1], [-1.387326, 'foo', 2], [0.814772, 'baz', ' '], [-0.222552, ' ', 4], [-1.176781, 'qux', ' '], ], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06')) # replace field that's entirely space (or empty) with NaN print(df.replace(r'^\s*$', np.nan, regex=True))
输出结果为:
A B C 2000-01-01 -0.532681 foo 0 2000-01-02 1.490752 bar 1 2000-01-03 -1.387326 foo 2 2000-01-04 0.814772 baz NaN 2000-01-05 -0.222552 NaN 4 2000-01-06 -1.176781 qux NaN
正如 Temak 所指出的,如果您的有效数据包含空格,请使用 df.replace(r'^\s+$', np.nan, regex=True)
。