使用 loc 方法获取 DataFrame 的视图

我正在尝试使用该loc方法获取 pandas 数据框的视图,但是当我修改原始 DataFrame 时它没有按预期工作。

我想使用该loc方法提取 DataFrame 的一行/切片,以便在对 DataFrame 进行修改时,切片反映更改。


让我们看一下这个例子:


import pandas as pd

import numpy as np

df = pd.DataFrame({'ID':np.arange(0,5,2), 'a':np.arange(3), 'b':np.arange(3)}).set_index('ID')

df

    a   b

ID      

0   0   0

2   1   1

4   2   2

现在我使用 loc 创建一个切片:


slice1 = df.loc[[2],]

slice1


    a   b

ID      

2   1   1

然后我修改原来的DataFrame:


df.loc[2, 'b'] = 9

df


    a   b

ID      

0   0   0

2   1   9

4   2   2

但不幸的是,我们的切片并没有像我期望的那样反映这种修改:


slice1

    a   b

ID      

2   1   1

我的期望:


    a   b

ID      

2   1   9

我发现使用 和 的组合进行了丑陋的修复iloc,loc但我希望有更好的方法来获得我期望的结果。

谢谢您的帮助。


阿晨1998
浏览 178回答 2
2回答

狐的传说

我尝试测试如何在链式赋值中重写值与 .loc 参考上面@Quang Hoang 共享的 pandas 文档链接。这是我试过的:dfmi = pd.DataFrame([list('abcd'),   list('efgh'),   list('ijkl'),   list('mnop')],   columns=pd.MultiIndex.from_product([['one', 'two'],   ['first', 'second']]))df1 = dfmi['one']['second']df2 = dfmi.loc[:, ('one', 'second')]df1 和 df2 的输出:0    b1    f2    j3    n迭代 1:value = ['z', 'x', 'c', 'v']dfmi['one']['second'] = value输出 df1:0    z1    x2    c3    v迭代 2:value = ['z', 'x', 'c', 'v']dfmi.loc[:, ('one', 'second')] = value输出 df2:0    z1    x2    c3    v在这两种情况下,新集合的分配都会改变值。文件说:引用 1:“方法 2 (.loc) 比方法 1 (chained []) 更受欢迎”引用 2:'在简单情况之外,很难预测“ getitem ”(由链式选项使用)是否会返回视图或副本(这取决于数组的内存布局,pandas 对此不做任何保证),因此,“ setitem ”(由 .loc 使用)是否会修改 dfmi 或随后立即被丢弃的临时对象。我无法理解上面的解释。如果 dfmi 中的值可以改变(在我的情况下)并且可能不会改变(就像在 Benoit 的情况下)那么通过哪种方式获得结果?不确定我是否遗漏了一点。寻求帮助

繁华开满天机

切片没有反映您在原始数据框中所做的更改的原因是 b/c 您首先创建了切片。创建切片时,您创建了数据切片的“副本”。您没有直接将两者联系起来。这里的简短回答是,您有两个选择 1) 首先更改原始 df,然后创建一个切片 2) 不切片,只需使用 .loc 或 iloc 引用原始 df 进行操作
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python