运行以下代码时:
import pandas as pd
df = pd.DataFrame({"A": [1,2,3],"B": [2,4,8]})
df2 = df[df["A"] < 3]
df2["C"] = 100
我收到以下警告:
SettingsWithCopyWarning:一个值
正在尝试在 DataFrame 的切片副本上进行设置。尝试使用
.loc[row_indexer,col_indexer] = value 请参阅
文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
但这正是我想要的行为(真实的表很大,我不想复制它),为什么我会收到警告?为什么有风险?
df
A B
0 1 2
1 2 4
2 3 8
df2
A B C
0 1 2 100
1 2 4 100
为什么会出现这种情况?
Because df2
是切片的副本df
.
为什么有风险?
这是一条消息,告诉您df2
and df
是不同的东西。引入这一点是因为它们并不总是显而易见的。
从文档中获取示例代码:
def do_something(df):
foo = df[['bar', 'baz']] # Is foo a view? A copy? Nobody knows!
# ... many lines here ...
foo['quux'] = value # We don't know whether this will modify df or not!
return foo
我该如何解决?
通过显式复制切片:
df2 = df[df['A'] < 3].copy()
df2['C'] = 100
或通过使用loc
:
df.loc[df['A'] < 3, 'C'] = 100
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)