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



我正在尝试从熊猫数据帧中选择一些行并将子集/选择存储到变量中,以便我可以对该子集执行多个操作(包括修改(,而无需再次进行选择。但我不太明白为什么它不起作用。

例如,这不能按预期工作(原始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__(。在这里,由于它必须为该切片分配一个值,因此保证它是一个视图。

相关内容

最新更新