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'

我真的很困惑如何使用locilocix进行布尔索引,即如何以正确的顺序提供行索引、列索引和布尔索引正确的语法。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案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:更改通过列中的布尔索引选择的值而不会收到警告的主要内容,如果未能解决你的问题,请参考以下文章

pandas:根据另一列中的值获取与相应索引的确切对应值

SQL:根据 B 列中的布尔值更改 SELECT 查询以在 A 列上显示不同的值

使用pandas创建稀疏矩阵,并使用来自.dat文件的其他两列的索引[x,y]的.dat文件的一列中的值填充它

Pandas:仅当特定列中的值以开头时才选择数据框行

pandas DataFrame 列中的布尔运算

Python Pandas pivot_table - 一列中的值计数[重复]