使用 loc 方法获取 DataFrame 的视图

Ben*_*uet 5 python dataframe pandas

我正在尝试使用该loc方法获取Pandas数据帧的视图,但是当我修改原始数据帧时它没有按预期工作。
我想使用该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
Run Code Online (Sandbox Code Playgroud)

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

slice1 = df.loc[[2],]
slice1

    a   b
ID      
2   1   1
Run Code Online (Sandbox Code Playgroud)

然后我修改原始DataFrame:

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

    a   b
ID      
0   0   0
2   1   9
4   2   2
Run Code Online (Sandbox Code Playgroud)

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

slice1
    a   b
ID      
2   1   1
Run Code Online (Sandbox Code Playgroud)

我的期望:

    a   b
ID      
2   1   9
Run Code Online (Sandbox Code Playgroud)

我发现了一个使用 和 的组合的丑陋修复ilocloc但我希望有一种更好的方法来获得我期望的结果。
感谢您的帮助。

Ans*_*hul 0

免责声明:这不是答案。

\n\n

我尝试测试如何覆盖链式赋值与 .loc 中的值,参考上面 @Quang Hoang 共享的 pandas 文档链接。

\n\n

这是我尝试过的:

\n\n
dfmi = pd.DataFrame([list(\'abcd\'),\n   list(\'efgh\'),\n   list(\'ijkl\'),\n   list(\'mnop\')],\n   columns=pd.MultiIndex.from_product([[\'one\', \'two\'],\n   [\'first\', \'second\']]))\n\ndf1 = dfmi[\'one\'][\'second\']\ndf2 = dfmi.loc[:, (\'one\', \'second\')]\n
Run Code Online (Sandbox Code Playgroud)\n\n

df1 和 df2 的输出:

\n\n
0    b\n1    f\n2    j\n3    n\n
Run Code Online (Sandbox Code Playgroud)\n\n

迭代 1:

\n\n
value = [\'z\', \'x\', \'c\', \'v\']\ndfmi[\'one\'][\'second\'] = value\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出 df1:

\n\n
0    z\n1    x\n2    c\n3    v\n
Run Code Online (Sandbox Code Playgroud)\n\n

迭代 2:

\n\n
value = [\'z\', \'x\', \'c\', \'v\']\ndfmi.loc[:, (\'one\', \'second\')] = value\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出 df2:

\n\n
0    z\n1    x\n2    c\n3    v\n
Run Code Online (Sandbox Code Playgroud)\n\n

新集合的分配正在改变这两种情况下的值。

\n\n

文档说:

\n\n

引用 1:“方法 2 (.loc) 比方法 1(链式 [])更受欢迎”

\n\n

引用 2:\n\'除了简单的情况外,\xe2\x80\x99s 很难预测“ getitem ”(由链式选项使用)是否会返回视图或副本(这取决于数组的内存布局,对此 pandas 不做任何保证),因此“ setitem ”(由 .loc 使用)是否会修改 dfmi 或随后立即抛出的临时对象。\'

\n\n

我无法理解上面的解释。如果 dfmi 中的值可以更改(在我的情况下)并且可能不会更改(如 Benoit\ 的情况),那么通过哪种方式获得结果?不确定我是否在这里遗漏了一点。\n寻求帮助

\n