Pandas:更改通过列中的布尔索引选择的值而不会收到警告
Posted
技术标签:
【中文标题】Pandas:更改通过列中的布尔索引选择的值而不会收到警告【英文标题】:Pandas: Change values chosen by boolean indexing in a column without getting a warning 【发布时间】:2017-01-29 10:52:18 【问题描述】:我有一个数据框,我只想更改另一列满足特定条件的列的值。我目前正在尝试使用iloc
执行此操作,但它要么不起作用,要么我收到了那个烦人的警告:
试图在数据帧的切片副本上设置值
例子:
import pandas as pd
DF = pd.DataFrame('A':[1,1,2,1,2,2,1,2,1],'B':['a','a','b','c','x','t','i','x','b'])
做其中之一
DF['B'].iloc[:][DF['A'] == 1] = 'X'
DF.iloc[:]['B'][DF['A'] == 1] = 'Y'
有效,但会导致上述警告。
这个也给出警告,但不起作用:
DF.iloc[:][DF['A'] == 1]['B'] = 'Z'
我真的很困惑如何使用loc
、iloc
和ix
进行布尔索引,即如何以正确的顺序提供行索引、列索引和布尔索引正确的语法。
谁能帮我解决这个问题?
【问题讨论】:
【参考方案1】:你正在链接你的选择器,导致警告。将所选内容合并为一个。
请改用loc
DF.loc[DF['A'] == 1, 'B'] = 'X'
DF
【讨论】:
【参考方案2】:使用ix
:
import pandas as pd
DF = pd.DataFrame('A':[1,1,2,1,2,2,1,2,1],'B':['a','a','b','c','x','t','i','x','b'])
DF.ix[DF['A'] == 1, 'B'] = 'X'
print (DF)
0 1 X
1 1 X
2 2 b
3 1 X
4 2 x
5 2 t
6 1 X
7 2 x
8 1 X
mask
的另一个解决方案:
DF.B = DF.B.mask(DF['A'] == 1, 'X')
print (DF)
A B
0 1 X
1 1 X
2 2 b
3 1 X
4 2 x
5 2 t
6 1 X
7 2 x
8 1 X
关于SettingWithCopy
by Tom Augspurger的好文章。
【讨论】:
感谢您的文章,遗憾的是其中的链接都不起作用,它们都是 404。 有趣,对我来说效果很好。也许firewall
有问题?
此链接来自官方pandas documentation - Modern pandas
发现问题。如果我先点击一个子页面,即“现代熊猫(第 1 部分)”,然后从那里点击其中一个列表项,则一切正常。直接单击概览页面上的列表项不起作用,因为它们的链接地址不同,它们在链接中有一个额外的/author/
,这显然是错误的。
有趣,我尝试更改链接以回复http://tomaugspurger.github.io/modern-1.html
,现在可以了吗?以上是关于Pandas:更改通过列中的布尔索引选择的值而不会收到警告的主要内容,如果未能解决你的问题,请参考以下文章
SQL:根据 B 列中的布尔值更改 SELECT 查询以在 A 列上显示不同的值