我试图从熊猫数据框中选择一些行,并将子集/选择存储到变量中,以便我可以对此子集执行多项操作(包括修改),而不必再次进行选择。但是我不太明白为什么它不起作用。
例如,这不能正常工作(原始df
未被修改):
df = pd.DataFrame({"a":list(range(1,3))})
subDf = df.loc[df.a==2,:]
subDf.loc[:,"a"] = -1 # also throws SettingWithCopyWarning
# ... do more stuff with subDf...
但是,这可以按预期工作:
df = pd.DataFrame({"a":list(range(1,3))})
mask = (df.a==2)
df.loc[mask,"a"] = -1
在阅读了有关索引视图与复制的熊猫文档之后,我的印象是通过.loc
进行选择将返回一个视图,但是显然在给定SettingWithCopyWarning的情况下并非如此。我在这里误会什么?
答案 0 :(得分:1)
在subDf = df.loc[df.a==2,:]
中,您使用的方法实际上是__getitem__
(df.loc.__getitem__
),不能保证会返回视图。当您为loc
分配某些内容(例如df.loc[mask,"a"] = -1
)时,您实际上是在呼叫__setitem__
(df.loc.__setitem__
)。在这里,由于必须为该切片分配值,因此可以保证它是视图。