Python在使用字符串的dataframe列上执行.replace时忽略前导空格

时间:2016-02-28 16:25:20

标签: python regex string replace whitespace

我有一个数据帧列,通常包含数字,但有些条目写为'No Data'

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]})

但是,某些条目(如上例所示)可能以空格' No Data'开头。我正在尝试找到一种有效的方法来替换所有No Data条目NaN,而不必担心额外的空间。现在,我所拥有的是

df['group'].replace('No Data', np.nan)
print df

除非我在搜索字词中添加空格,否则不起作用

df['group'].replace(' No Data', np.nan)

虽然这有效,但我希望有一种更好的方法可以做到,而无需检查额外的空间。

注意:我也可以list comprehension并使用in

来实现这一目标
[np.nan if 'No Data' in str(x) else x for x in df['group']]

哪个会正常工作,但我认为replace更具可读性。

2 个答案:

答案 0 :(得分:1)

Pandas允许您使用带有替换功能的正则表达式,因此您可以这样做:

df['group'].replace("\s*No Data", np.nan, regex=True)

答案 1 :(得分:1)

您可以通过将正则表达式集成到您建议的replace函数中来实现所需的结果:

import pandas as pd
import numpy as np

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]})

df = df.replace(r'No Data', np.nan, regex=True)
print df

<强>输出

   group
0      1
1      2
2      3
3    NaN
4      4
5      5
6      6

使用正则表达式r'No data'将在您的单元格中的任何位置查找字符串'No data'。如果找到匹配项,则该单元格将替换为np.nan

另一种方法是使用applymap将简单的lambda函数应用于数据框中的每个单元格。我认为这是一个非常易读的解决方案:

import pandas as pd
import numpy as np

df=pd.DataFrame({'group':[1,2,3,' No Data',4,5,6]})

df = df.applymap(lambda x: np.nan if type(x) == str and 'No Data' in x else x)
print df

<强>输出

   group
0      1
1      2
2      3
3    NaN
4      4
5      5
6      6
相关问题