gpt4 book ai didi

python - 了解 Pandas SettingWithCopyWarning

转载 作者:太空狗 更新时间:2023-10-30 02:30:30 26 4
gpt4 key购买 nike

我有以下代码,但不太明白为什么它会抛出警告。我读过 documentation但仍然无法理解为什么这种用法会导致警告。任何见解将不胜感激。

>>> 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 切片的引用,但实际上是一个副本。这与正常语义不同,在正常语义中,人们期望这会导致引用,并且对该引用的修改将影响引用和原始对象(当然对于可变对象):

In [14]:

foo = [0]
bar = foo
bar.append(1)
print(foo,bar)
[0, 1] [0, 1]

因此,如果您想修改 df 的特定切片,那么您应该按照警告的建议进行操作:

In [18]:

df.loc[df['a']>3,'a'] =df['a']/3
df
Out[18]:
a b
0 1.000000 11
1 2.000000 22
2 3.000000 33
3 1.333333 44
4 1.666667 55
5 2.000000 66
6 2.333333 77

或者调用 copy() 进行显式深度复制并在不生成任何警告的情况下修改副本:

In [20]:

reduced_df = df[df['a'] > 3].copy()
reduced_df['a'] /=3
reduced_df
Out[20]:
a b
3 1.333333 44
4 1.666667 55
5 2.000000 66
6 2.333333 77

In [21]:
# orig df is unmodified
df
Out[21]:
a b
0 1 11
1 2 22
2 3 33
3 4 44
4 5 55
5 6 66
6 7 77

关于python - 了解 Pandas SettingWithCopyWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26536327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com