Pandas替换不能在多列子集上按预期工作

时间:2018-06-13 13:58:12

标签: python pandas

在仅在几列上进行替换时,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。

1 个答案:

答案 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