replace() 方法不适用于 Pandas DataFrame
- 2025-01-16 08:38:00
- admin 原创
- 78
问题描述:
我查过这个问题,大多数问题都是针对更复杂的替换。不过,在我的例子中,我有一个非常简单的数据框作为测试假人。
目的是用 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。
解决方案 1:
鉴于这是在 Google 上搜索“Pandas replace is not working”时得到的最佳结果,我还想提一下:
replace 会进行完全替换搜索,除非您打开正则表达式开关。使用 regex=True,它也应该执行部分替换。
我花了 30 分钟才发现这一点,所以希望我能为其他人节省 30 分钟。
解决方案 2:
您需要分配回
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
大多数 pandas 操作都会返回一个副本,并且大多数都有参数inplace
,通常默认为False
解决方案 3:
在我的情况下, with 和inplace=True
with都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:
在直接使用替换函数之前,您可能需要检查列的数据类型。您可能正在对 Object 数据类型使用替换函数,在这种情况下,您需要在将其转换为字符串后应用替换函数。
Wrong:
df["column-name"] = df["column-name"].replace('abc', 'def')
Correct:
df["column-name"] = df["column-name"].str.replace('abc', 'def')
解决方案 5:
当您使用df.replace()
它时,它会创建一个新的临时对象,但不会修改您的对象。您可以使用以下两行之一来修改 df:
df = df.replace('white', np.nan)
df.replace('white', np.nan, inplace = True)
解决方案 6:
对我有用的是使用这个字典符号。
{旧值:新值}
df.replace({10:100},inplace=True)
查看文档以获取更多信息。https
://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.DataFrame.replace.html
解决方案 7:
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
解决方案 8:
df.replace({'white': np.nan}, inplace=True, regex=True)
解决方案 9:
也许我偶然发现的案例可以有所帮助:
我通过 导入了一些来自 CSV 文件的数据pd.read_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 )
解决方案 10:
还有一个原因是,我遇到 .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)