将大熊猫选择分配给变量,然后对其进行修改

时间:2018-08-27 09:31:45

标签: python pandas

我试图从熊猫数据框中选择一些行,并将子集/选择存储到变量中,以便我可以对此子集执行多项操作(包括修改),而不必再次进行选择。但是我不太明白为什么它不起作用。

例如,这不能正常工作(原始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的情况下并非如此。我在这里误会什么?

1 个答案:

答案 0 :(得分:1)

subDf = df.loc[df.a==2,:]中,您使用的方法实际上是__getitem__df.loc.__getitem__),不能保证会返回视图。当您为loc分配某些内容(例如df.loc[mask,"a"] = -1)时,您实际上是在呼叫__setitem__df.loc.__setitem__)。在这里,由于必须为该切片分配值,因此可以保证它是视图。