繁体   English   中英

熊猫替换特定列上的值

[英]Pandas replacing values on specific columns

我知道这两个类似的问题:

熊猫替换值

熊猫:替换数据框中的列值

我使用了一种不同的方法来替换我认为应该是最干净的值。 但它不起作用。 我知道如何解决它,但我想了解为什么它不起作用:

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]: ABC 0 3 7 8 1 6 4 8 2 5 3 8

(您也可以使用df.loc[:,['A','B']] ,但如上所述更清楚。

to_rep = dict(zip([1, 3, 2],[3, 6, 7]))
df.replace({'A':to_rep, 'B':to_rep}, inplace = True)

这将返回:

   A  B  C
0  3  7  8
1  6  4  8
2  5  3  8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM