对于以下数据框,
id words A B C D E
1 new a 1 1
2 good v 1
3 star c 1
4 never
5 final
我尝试使用以下代码用空值替换空格:
df1.loc[:, ["A", "B", "C", "E", "D" ]].replace (r'\s+', np.nan, regex = True, inplace = True)
但它没有用。我也试过这段代码:
df1[["A", "B", "C", "E", "D" ]].replace (r'\s+', np.nan, regex = True, inplace = True)
它也没用。
但是使用以下代码,它可以工作:
df1.A.replace (r'\s+', np.nan, regex = True, inplace = True)
df1.B.replace (r'\s+', np.nan, regex = True, inplace = True)
df1.C.replace (r'\s+', np.nan, regex = True, inplace = True)
df1.D.replace (r'\s+', np.nan, regex = True, inplace = True)
df1.E.replace (r'\s+', np.nan, regex = True, inplace = True)
有人知道为什么吗?谢谢。
答案 0 :(得分:3)
从DataFrame中选择列时,返回的对象是副本。如果在该副本上调用方法,inplace
参数将在副本上运行 - 而不是在实际的DataFrame上。
df1.loc[:, ["A", "B", "C", "E", "D" ]].replace (r'\s+', np.nan, regex = True, inplace = True)
此行实际上修改了一个DataFrame,但由于该DataFrame未分配给任何内容,因此您看不到结果。
使用示例DataFrame:
df = pd.DataFrame()
df['words'] = ['x', 'y', 'z', 't']
df['A'] = [1, 1, '', '']
df['B'] = ['', '', '', '']
df['C'] = [1, '', 1, '']
df['D'] = ['', ' ', ' ', ' ']
df['E'] = [' ', ' ', '', '']
df
Out:
words A B C D E
0 x 1 1
1 y 1
2 z 1
3 t
您需要将结果分配回来:
cols = ["A", "B", "C", "E", "D" ]
df.loc[:, cols] = df.loc[:, cols].replace (r'\s+', np.nan, regex=True)
请注意,这将仅替换具有1个或多个空格的单元格。如果您还需要替换空字符串,请将其更改为
df.loc[:, cols] = df.loc[:, cols].replace (r'\s*', np.nan, regex=True)
df
Out:
words A B C D E
0 x 1 NaN 1 NaN NaN
1 y 1 NaN NaN NaN NaN
2 z NaN NaN 1 NaN NaN
3 t NaN NaN NaN NaN NaN
答案 1 :(得分:2)
@ayhan的回答要好得多,但是我提供这个作为一种快速而又脏的方法,用NaN代替一堆空白:
df1.replace('', np.NaN, inplace=True)