Python 无法在多列子集上按预期工作

Python 无法在多列子集上按预期工作,python,pandas,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

仅对少数列执行替换时,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
请注意,我没有得到复制警告设置-而且,我使用的是推荐的.loc。因为我使用inplace=True,所以我希望数据帧会发生变化。我是做错了什么,还是这是一个在github上报告的bug


我使用的是pandas版本0.23.0。

您不能使用
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
另一种解决方案是,在原地默认工作

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

a.loc[:,[“x”,“y”]]
使用
.loc.\uu getitem\uuu
。使用
\uuuu getitem\uuuu
时,返回的对象可能是副本。在这里,
a.loc[:,[“x”,“y”]]
返回一个副本,该副本实际上在原地修改,但由于您没有将其分配给任何对象,因此无法看到更改。原始的df也保持不变。这很快,而且有效,谢谢。不幸的是,这意味着我必须键入索引两次(右侧和左侧),没有办法解决这个问题吗?不幸的是,我真正的索引没有[:,[“x”,“y”]]:-\@Thomas那么短,或者你可以将索引保存到一个变量:
idx=pd.indexlice[:,['x',y']]]
中,并在loc:
a.loc[idx]=…
@jezrael:好主意!我不会想到在这种情况下使用update,我只是用它来代替NAvalues@user2285236当前位置我甚至不知道有关Indexlice的事。这将在将来非常有用。很高兴我问了这个问题。@user2285236-只需测试它
idx=pd.indexlice[[1,2],'x','y']]a.loc[idx]=4