为数据框的子集替换空值为空的空格

时间:2017-06-18 19:27:31

标签: python pandas

对于以下数据框,

 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)

有人知道为什么吗?谢谢。

2 个答案:

答案 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)