给出此数据框
df = pd.DataFrame({'x': range(10,51,10),
'y': [False]*5})
print(df)
--------
x y
0 10 False
1 20 False
2 30 False
3 40 False
4 50 False
有没有一种方法可以查询x
上的数据框,并强制熊猫返回我可以在将来某个时候修改的视图?
view = df.loc[df.x <= 20]
print(view._is_view) # returns False
# ... life goes by for a while
view.y = True # does not modify original df
我知道我可以做到
df.loc[df.x <=20, 'y'] = True
但是在我的情况下,查询和分配需要按时间和代码空间分开。我当前的解决方法是从查询中获取索引,然后只修改原始数据框,而不用弄乱视图。
注意为了简化起见,我省略了此操作,但在我的实际应用中,我需要将视图的每一行一一分配,并按时间分隔。如果我能使它正常工作,该视图将是光滑的。
答案 0 :(得分:1)
熊猫文件目前在这方面提供的指导很少。我找不到可以保证返回视图的情况的文档列表,例如如您的示例所示,无法保证.loc
返回视图。
据我了解,使用.loc
时更有可能返回视图的两个条件是:
.loc
访问的切片只有一个dtype
(有关类似情况的答案,请参见juanpa.arrivillaga在此处接受的答案:In Pandas, does .iloc method give a copy or view?)< / p>
所选内容是基础numpy数组的基本切片[i:j]
(这是我对此处unutbu接受的答案的理解:pandas dataframe view vs copy, how do I tell?)
在您的特定情况下,这意味着将df.loc[df.x <= 20]
更改为df.loc[0:1,'y']
,如下所示:
df = pd.DataFrame({'x': range(10,51,10),
'y': [False]*5})
view = df.loc[0:1,'y']
print(view._is_view) # returns True
view[:] = True
print(df)
结果为:
x y
0 10 True
1 20 True
2 30 False
3 40 False
4 50 False
这是否适用于您的用例取决于x
中的选择是否是连续的,就像在您的简化示例中一样。