在仅在几列上进行替换时,pandas replace()选项似乎存在问题:
# Example dataframe:
pd.DataFrame(data={"x":[1,2,3,4,5], "y":[2,4,1,2,4], "z":["no", "yes", "no", "no", "no"], "t":["a", "b", "c", "d", "d"]})
# Try to replace the 2s inplace:
a.loc[:, ["x", "y"]].replace(2,-9999, inplace=True)
a仍然是:
Out[32]:
x y z t
0 1 2 no a
1 2 4 yes b
2 3 1 no c
3 4 2 no d
4 5 4 no d
请注意,我没有得到settingWithCopy警告 - 另外,我按照建议使用.loc。因为我使用inplace = True,所以我希望数据帧能够改变。我做错了什么,或者这是一个报告github的错误?
我正在使用pandas版本0.23.0。
答案 0 :(得分:3)
您无法使用inplace=True
,因为子集会返回一个可能将其数据作为视图的系列。在适当的位置修改它并不总是将它传播回父对象。这就是为什么会出现这种警告(或者如果设置了选项则会提高)。你永远不应该这样做,也不应该这样做。
a.loc[:, ["x", "y"]] = a.loc[:, ["x", "y"]].replace(2,-9999)
print (a)
x y z t
0 1 -9999 no a
1 -9999 4 yes b
2 3 1 no c
3 4 -9999 no d
4 5 4 no d
另一个解决方案是update
,默认工作inplace
:
a.update(a.loc[:, ["x", "y"]].replace(2,-9999))
print (a)
x y z t
0 1 -9999 no a
1 -9999 4 yes b
2 3 1 no c
3 4 -9999 no d
4 5 4 no d