我尝试在将其与另一个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'])中断?
答案 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,则您忘记制作副本并最终遇到了令人讨厌的错误...