【问题标题】:Pandas: Change values chosen by boolean indexing in a column without getting a warningPandas:更改通过列中的布尔索引选择的值而不会收到警告
【发布时间】: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进行布尔索引,即如何以正确的顺序提供行索引、列索引和布尔索引正确的语法。

谁能帮我解决这个问题?

【问题讨论】:

    标签: python python-2.7 pandas indexing conditional-statements


    【解决方案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 有问题?
      • 发现问题。如果我先点击一个子页面,即“现代熊猫(第 1 部分)”,然后从那里点击其中一个列表项,则一切正常。直接单击概览页面上的列表项不起作用,因为它们的链接地址不同,它们在链接中有一个额外的/author/,这显然是错误的。
      • 有趣,我尝试更改链接以回复http://tomaugspurger.github.io/modern-1.html,现在可以了吗?
      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 2019-12-07
      • 2018-08-18
      • 2021-06-30
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多