replace()方法在Pandas数据框上不起作用

jjhzyzn0  于 2023-01-01  发布在  其他
关注(0)|答案(9)|浏览(420)

我已经查找了这个问题,大多数问题都是针对更复杂的替换。但是,在我的情况下,我有一个非常简单的 Dataframe 作为测试假人。
目标是用nan替换 Dataframe 中任何地方的字符串,然而这似乎不起作用(即:不替换;没有任何错误)。我试过用另一个字符串替换,但也不起作用。

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来解决,但也有一些警告。

wz8daaqr

wz8daaqr1#

考虑到这是搜索“Pandas替换不起作用”时的最佳谷歌结果,我还想提一下:
replace执行完全替换搜索,除非你打开regex开关。使用regex=True,它也应该执行部分替换。
我花了30分钟才找到答案,所以希望我为下一个人节省了30分钟。

enyaitl3

enyaitl32#

你需要重新分配

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

大多数panda操作都会返回一个拷贝,并且大多数都具有参数inplace,该参数通常默认为False

ndh0cuux

ndh0cuux3#

无论是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
bnl4lu3b

bnl4lu3b4#

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

Wrong:

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

Correct:

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

8wtpewkr5#

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

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

92vpleto6#

对我有效的是使用这个dict符号。
{old值:新值}

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

检查这文档为更多信息. https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.replace.html

dphi5xsq

dphi5xsq7#

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

oxosxuxt8#

Python 3.10,panda 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

...在另一个涉及文本列中的nans的情况下,需要在预先步骤中键入列(而不仅仅是如上所述的.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
2ekbmq32

2ekbmq329#

另一个原因,在那里我面临。替换功能不工作,我找到了原因并修复。
如果列中的字符串为“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)

相关问题