熊猫系列 .loc[[0,1]] 与 .loc[0:1]

Pandas Series .loc[[0,1]] versus .loc[0:1]

提问人:Moormanly 提问时间:8/9/2019 最后编辑:Moormanly 更新时间:8/10/2019 访问量:191

问:

TL的;dr:为什么 .loc[[0,1]] 似乎创建了一个副本,而 .loc[0:1] 似乎创建了一个引用?


在寻找这个问题的答案时,我发现它的行为与 .例如,如果我有一个熊猫系列,例如:.loc[[0,1]].loc[0:1]

>>> import pandas as pd
>>> my_series = pd.Series(dict(x=0, y=1, z=2))
>>> my_series
x    0
y    1
z    2
dtype: int64

我使用索引它,这似乎创建了一个副本.loc[['x','y']]

>>> my_series = pd.Series(dict(x=0, y=1, z=2))
>>> reference = my_series.loc[['x', 'y']]
>>> my_series.x = 10
>>> reference
x    0
y    1
dtype: int64

而当我使用 索引它时,这似乎创建了一个引用.loc['x':'y']

>>> my_series = pd.Series(dict(x=0, y=1, z=2))
>>> reference = my_series.loc['x':'y']
>>> my_series.x = 10
>>> reference
x    10
y    1
dtype: int64

这是怎么回事?


相同的行为仍然存在,省略了.loc

>>> reference = my_series[['x', 'y']]

>>> reference = my_series['x':'y']

我在文档中看到了这个页面 返回视图与副本,但它没有解释观察到的行为差异。

Python Pandas 索引 切片

评论

1赞 user3483203 8/9/2019
请确保重置回创建第二个引用之前,否则即使它确实返回了副本my_series.x0x10
1赞 Scott Boston 8/9/2019
来自文档 “除了简单情况之外,很难预测它会返回视图还是副本(这取决于数组的内存布局,pandas 对此不作任何保证)......”
1赞 Scott Boston 8/10/2019
我认为是一般的,但我找不到返回视图与副本的确切文档。
1赞 GZ0 8/10/2019
由于下面使用了,我认为这种行为与 Numpy 数组对花哨索引的处理(即使用索引数组访问元素)是一致的。您可以在此处找到一些文档:scipy-cookbook.readthedocs.io/items/ViewsVsCopies.htmlpandasnumpy
1赞 Davis Herring 8/10/2019
当然,问题在于切片具有已知的(连续)结构,但使用列表进行索引不能如此有效地表示?

答: 暂无答案