我知道这两个类似的问题:
熊猫取代了价值观
Pandas:替换数据帧中的列值
我使用了一种不同的方法来替换值,我认为它应该是最干净的值.但它不起作用.我知道如何解决它,但我想理解为什么它不起作用:
In [108]: df=pd.DataFrame([[1, 2, 8],[3, 4, 8], [5, 1, 8]], columns=['A', 'B', 'C']) In [109]: df Out[109]: A B C 0 1 2 8 1 3 4 8 2 5 1 8 In [110]: df.loc[:, ['A', 'B']].replace([1, 3, 2], [3, 6, 7], inplace=True) In [111]: df Out[111]: A B C 0 1 2 8 1 3 4 8 2 5 1 8 In [112]: df.loc[:, 'A'].replace([1, 3, 2], [3, 6, 7], inplace=True) In [113]: df Out[113]: A B C 0 3 2 8 1 6 4 8 2 5 1 8
如果我只切片一列,In [112]
那么切片几列就不同了In [110]
.据我了解该.loc
方法,它返回一个视图而不是一个副本.在我的逻辑中,这意味着在切片上进行原位更改应该更改整个DataFrame.这是在线发生的事情In [110]
.
以下是其中一位开发人员的回答:https://github.com/pydata/pandas/issues/11984
这应该理想地显示一个SettingWithCopyWarning,但我认为这很难检测.
你永远不应该做这种类型的链式就地设置.这简直是不好的做法.
惯用的是:
In [7]: df[['A','B']] = df[['A','B']].replace([1, 3, 2], [3, 6, 7]) In [8]: df Out[8]: A B C 0 3 7 8 1 6 4 8 2 5 3 8
(你也可以这样做df.loc[:,['A','B']]
,但如上所述更清楚.