我有一个数据帧列,通常包含数字,但有些条目写为'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
更具可读性。
答案 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