我有以下代码,但不太明白为什么会出现警告。我已经阅读了文档,但仍然无法理解为什么使用会导致警告。如有任何见解,请指教。
>>> df = pandas.DataFrame({'a': [1,2,3,4,5,6,7], 'b': [11,22,33,44,55,66,77]})
>>> reduced_df = df[df['a'] > 3]
>>> reduced_df
a b
3 4 44
4 5 55
5 6 66
6 7 77
>>> reduced_df['a'] /= 3
Warning (from warnings module):
File "__main__", line 1
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
>>> reduced_df
a b
3 1.333333 44
4 1.666667 55
5 2.000000 66
6 2.333333 77
reduced_df = df[df['a'] > 3]
的意思是reduced_df
是从df
中切片出来的副本,你现在试图对其进行赋值,因此会出现警告。你可以像这样显式地复制:reduced_df = df[df['a'] > 3].copy()
或者如果你想修改原始的df
,那么可以使用df.loc[df['a']>3,'a'] = df['a']/3
。 - EdChumfoo = bar
意味着foo
是对bar
的引用,所以如果你修改了foo
,那么你期望bar
也会改变,但这里并非如此。 - EdChumreduced_df
所做的任何更改不会显示在df
中,因为reduced_df = df[df['a'] > 3]
这行代码产生了一个深拷贝? - derNincompoopreduced_df = df[df['a'] >3].copy()
,那么就不会有警告,因为您现在已经明确地进行了深度复制。 - EdChum