使用iloc

时间:2017-02-25 10:51:08

标签: python pandas

我尝试在将其与另一个DataFrame合并并遇到一些问题后更改我的DataFrame中的值(在合并之前似乎没有问题)。

我正在使用以下代码索引和更改DataFrame中的值:

df.iloc[0]['column'] = 1

随后我使用merge在两个索引上加入(左外连接)(我意识到left.join(右)也会起作用)。在此之后,当我使用iloc执行相同的值赋值时,我收到以下警告:

__main__:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

对链接文档的审查并没有澄清理解,因此,我是否使用了错误的iloc切片方法? (请记住,为了我的代码,我需要基于位置的切片)

我注意到df.ix [0,'列'] = 1有效,同样基于this page我可以用df.columns.get_loc(&#39)引用列位置列#39;但从表面上看,这似乎是不必要的错综复杂。

这些方法之间的区别是什么,以及合并会导致之前的方法(df.iloc [0] [' column'])中断?

2 个答案:

答案 0 :(得分:1)

您在上面使用的是链式索引,为避免这种情况,请避免使用“ df.iloc[0]['column'] = 1”,并且会生成“ SettingWithCopy警告”。熊猫文档有些复杂,但请参见SettingWithCopy Warning with chained indexing,了解有关为何无法正常使用的详细解释。

您应该使用df.loc[0, 'column'] = 1

.loc用于“通过标签或布尔数组访问一组行和列。”

.iloc用于“基于整数的索引,用于按位置选择。”

答案 1 :(得分:0)

很糟糕,但是到目前为止,关于基于.ilocs的更新数据框列的最佳解决方案是找到列的iloc,然后对所有内容使用.iloc:

column_i_loc = np.where(df.columns =='column')[0] [0] df.iloc [0,column_i_loc] = 1

请注意,您也可以禁用该警告,但实际上不可以!...

此外,如果您遇到此警告并且没有尝试更新某些原始DataFrame,则您忘记制作副本并最终遇到了令人讨厌的错误...