Pandas DataFrame 上的 replace() 方法无法正常工作

46

我查阅了这个问题,大多数问题都是关于更复杂的替换。但是在我的情况下,我有一个非常简单的数据框作为测试虚拟数据。

目标是将数据框中的任何字符串替换为nan,但这似乎不起作用(即不替换;没有任何错误)。我尝试用另一个字符串替换,也不起作用。例如:

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

这个问题通常使用inplace=True来处理,但是需要注意其中的注意事项。 请参阅了解 pandas 中 inplace=True 的含义

10个回答

169

考虑到这是搜索“Pandas替换无效”时的顶级Google结果,我想补充一下:

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

我花了30分钟才找到这个答案,希望我能为下一个人节省30分钟。


5
我刚刚在替换一个被限定符包含的字符串中遇到了问题。请问您需要翻译成什么语言呢? - Will B
1
五年之后,你的答复仍然准确!这个答案应该被打上绿色的勾号。 - Soren V. Raben
楼主在这里 - 我多年前写了这个答案,至今仍然受益匪浅 - 我在StackOverflow上的90%得分来自这个答案和另一个关于如何在Python中计时的问题。真不敢相信这个问题在这么多年后仍然是人们普遍遇到的一个问题! - undefined

41
你需要重新赋值。
df = df.replace('white', np.nan)

或者传递参数 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

大多数熊猫操作都会返回一个副本,并且大多数都有参数inplace,通常默认为False


12
请注意,有些真正的错误会导致replace在某些情况下无法正常工作(参见问题#29813)。 - bluenote10
2
我遇到了一个问题,df.replace(x,y, inplace=True) 没有起作用,但是 df = df.replace(x,y) 起作用了。其中 xint64 类型,而 yfloat64 类型。 - MattR
跟@MattR一样,inplace不知道为什么不能工作。 - greendino
啊 - 我曾经遇到过类似的问题,即 inplace=True 明显没有效果,而将其分配给一个新变量则显示替换实际上起作用了。我当时正在使用正则表达式来删除空格等内容。 - logicOnAbstractions
我相信 df.foo(x, y, inplace=True) 现在已经被弃用,应该使用 df = df.foo(x, y) - jazcap53

19

在我的情况下,无论是使用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

15

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

Wrong:

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

Correct:

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

7
当你使用df.replace()时,它会创建一个新的临时对象,但不会修改原始数据。你可以使用以下两行代码之一来修改df:
df = df.replace('white', np.nan)
df.replace('white', np.nan, inplace = True)

2

1

Python 3.10,pandas 1.4.2,inplace=True 在下面的示例中(列 dtype int32)无法正常工作,但重新分配它可以。

df["col"].replace[[0, 130], [12555555, 12555555], inplace=True)  # NOT work
df["col"] = df["col"].replace[[0, 130], [12555555, 12555555])   # worked

...在另一种涉及文本列中存在 NaN 的情况下,该列需要在预处理步骤中进行输入 (不仅仅是使用上面的 .str):

df["col"].replace[["man", "woman", np.nan], [1, 2, -1], inplace=True)  # NOT work
df["col"] = df["col"].str.replace[["man", "woman", np.nan], [1, 2, -1])     # NOT work

df["col"] = df["col"].astype(str)    # needed
df["col"] = df["col"].replace[["man", "woman", np.nan], [1, 2, -1])   # worked

0
df.replace({'white': np.nan}, inplace=True, regex=True)

0
也许我遇到的情况可以帮到你:
我通过pd.read_csv()从CSV文件中导入了一些数据。这些数据是关于一个过程的性能,超时的情况用'INF'表示。
所以,我想我可以用类似下面的方法清理这些情况:
df = pd.read_csv ( "test-data.csv" )
df = df.replace ( 'INF', -1 )

然而,'INF' 被解释为 np.inf,即 NumPy 的无穷大,确实如此,
df [ 'col-with-inf' ] [ 'row-with-inf' ] == np.inf

True。所以,在这种情况下,你可以这样做:

df = df.replace ( np.inf, -1 )

-1

另一个原因是,我遇到了.replace函数无法正常工作的问题,并找到了原因并进行了修复。

如果您在列中有字符串“word1 word2”,当从Excel读取时,“word1”和“word2”之间的空格具有“nbsp”的含义,即非空格间距。如果我们用普通空格替换,一切都可以正常工作。我的列名是“Name”。

    nonBreakSpace = u'\xa0'
    df['Name'] = df['Name'].replace(nonBreakSpace,' ',regex=True)
    df['Name']=df["Name"].str.replace("replace with","replace to",regex=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接