我正在尝试从熊猫数据帧中选择一些行并将子集/选择存储到变量中,以便我可以对该子集执行多个操作(包括修改(,而无需再次进行选择。但我不太明白为什么它不起作用。
例如,这不能按预期工作(原始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
在阅读了关于索引视图与复制的 pandas 文档后,我的印象是通过.loc
选择将返回视图,但鉴于 SettingWithCopyWarning,显然情况并非如此。我在这里误解了什么?
subDf = df.loc[df.a==2,:]
你使用的方法实际上是__getitem__
(df.loc.__getitem__
(,它不能保证返回视图。当您将某些内容分配给loc
(例如df.loc[mask,"a"] = -1
(时,您实际上是在调用__setitem__
(df.loc.__setitem__
(。在这里,由于它必须为该切片分配一个值,因此保证它是一个视图。