Python 无法在多列子集上按预期工作
仅对少数列执行替换时,pandas replace()选项似乎存在问题: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
# 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