熊猫替换不起作用的元素

时间:2016-06-02 13:38:55

标签: python numpy pandas replace

我已经查找了这个问题,大多数问题都是针对更复杂的替代品。但是在我的情况下,我有一个非常简单的数据帧作为测试假人。

目标是用nan替换数据帧中任何位置的字符串,但这似乎不起作用(即不替换;无任何错误)。我尝试用另一个字符串替换它也不起作用。 E.g。

d = {'color' : pd.Series(['white', 'blue', 'orange']),
   'second_color': pd.Series(['white', 'black', 'blue']),
   'value' : pd.Series([1., 2., 3.])}
df = pd.DataFrame(d)
df.replace('white', np.nan)

输出仍然是:

      color second_color  value
  0   white        white      1
  1    blue        black      2
  2  orange         blue      3

6 个答案:

答案 0 :(得分:20)

鉴于这是搜索“Pandas replace is not working”时谷歌的最高结果,我还想提及:

  

替换完全替换搜索,除非您打开正则表达式   开关。使用regex = True,它应该执行部分替换   好。

我花了30分钟才发现,所以希望我已经把下一个人保存了30分钟。

答案 1 :(得分:18)

您需要分配回来

df = df.replace('white', np.nan)

或传递param inplace=True

In [50]:
d = {'color' : pd.Series(['white', 'blue', 'orange']),
   'second_color': pd.Series(['white', 'black', 'blue']),
   'value' : pd.Series([1., 2., 3.])}
df = pd.DataFrame(d)
df.replace('white', np.nan, inplace=True)
df

Out[50]:
    color second_color  value
0     NaN          NaN    1.0
1    blue        black    2.0
2  orange         blue    3.0

大多数pandas ops返回一个副本,大多数都有param inplace,通常默认为False

答案 2 :(得分:5)

当您使用df.replace()时,它会创建一个新的临时对象,但不会修改您的临时对象。您可以使用以下两行之一来修改df:

df = df.replace('white', np.nan)
df.replace('white', np.nan, inplace = True)

答案 3 :(得分:0)

在我的情况下,任何一个inplace=True或另一个regex=True都不起作用。 因此,我找到了一种使用Series.str.replace的解决方案。如果您需要替换子字符串,它会很有用。

In [4]: df['color'] = df.color.str.replace('e', 'E!')
In [5]: df  
Out[5]: 
     color second_color  value
0   whitE!        white    1.0
1    bluE!        black    2.0
2  orangE!         blue    3.0

甚至切片。

In [10]: df.loc[df.color=='blue', 'color'] = df.color.str.replace('e', 'E!')
In [11]: df  
Out[11]: 
    color second_color  value
0   white        white    1.0
1   bluE!        black    2.0
2  orange         blue    3.0

答案 4 :(得分:0)

在直接使用替换功能之前,您可能需要检查列的数据类型。可能是你在Object数据类型上使用了replace函数,在这种情况下,你需要在将其转换为字符串后应用replace函数。

Wrong:

df["column-name"] = df["column-name"].replace('abc', 'def')

Correct:

df["column-name"] = df["column-name"].str.replace('abc', 'def')

答案 5 :(得分:0)

对我有用的是使用这个 dict 符号。

{old_value:new_value}

df.replace({10:100},inplace=True)

查看文档以获取更多信息。 https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.replace.html