python - 使用 loc 方法获取 DataFrame 的 View

标签 python pandas dataframe

我正在尝试使用 loc 获取 Pandas 数据框的 View 方法,但当我修改原始 DataFrame 时它没有按预期工作。
我想使用 loc 提取 DataFrame 的一行/切片方法,以便在对 DataFrame 进行修改时,切片会反射(reflect)更改。

让我们看看这个例子:

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

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

slice1
    a   b
ID      
2   1   1

我的期望:

    a   b
ID      
2   1   9

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

最佳答案

免责声明:这不是答案。

我尝试测试如何覆盖链式赋值与 .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    b
1    f
2    j
3    n

迭代 1:
value = ['z', 'x', 'c', 'v']
dfmi['one']['second'] = value

输出df1:
0    z
1    x
2    c
3    v

迭代 2:
value = ['z', 'x', 'c', 'v']
dfmi.loc[:, ('one', 'second')] = value

输出df2:
0    z
1    x
2    c
3    v

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

文档说:

引用 1: '方法 2 (.loc) 比方法 1 (chained [])' 更受欢迎

引用 2:
'除了简单的情况,很难预测“ getitem ”(由链接选项使用)是否会返回一个 View 或一个副本(这取决于数组的内存布局,关于哪个pandas没有保证),因此“ setitem ”(由 .loc 使用)是否会修改 dfmi 或之后立即被抛出的临时对象。

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

关于python - 使用 loc 方法获取 DataFrame 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61890845/

相关文章:

python - 使用 Python lambda 中的 JSON 日志格式

Python 元素树 : Ignore undefined prefixes

python - 如何在 python 中做嵌套子图

python - 如何根据某些条件连接 pandas 列中的两个单元格?

python - 如何重新排列 python pandas 数据框?

python - pandas 数据框 reshape /透视

python - 替换 pandas 数据框 x;如果 bool 数组中的相应索引为 True,则 y 值为 NaN

python - 对多个列表重复操作

python - easy_install 'develop' 命令在 virtualenv 中无法工作

Pandas 数据框将列类型转换为字符串或分类