为了账号安全,请及时绑定邮箱和手机立即绑定

使用 loc 方法获取 DataFrame 的视图

使用 loc 方法获取 DataFrame 的视图

阿晨1998 2022-11-29 15:13:54
我正在尝试使用该loc方法获取 pandas 数据框的视图,但是当我修改原始 DataFrame 时它没有按预期工作。我想使用该loc方法提取 DataFrame 的一行/切片,以便在对 DataFrame 进行修改时,切片反映更改。让我们看一下这个例子:import pandas as pdimport numpy as npdf = pd.DataFrame({'ID':np.arange(0,5,2), 'a':np.arange(3), 'b':np.arange(3)}).set_index('ID')df    a   bID      0   0   02   1   14   2   2现在我使用 loc 创建一个切片:slice1 = df.loc[[2],]slice1    a   bID      2   1   1然后我修改原来的DataFrame:df.loc[2, 'b'] = 9df    a   bID      0   0   02   1   94   2   2但不幸的是,我们的切片并没有像我期望的那样反映这种修改:slice1    a   bID      2   1   1我的期望:    a   bID      2   1   9我发现使用 和 的组合进行了丑陋的修复iloc,loc但我希望有更好的方法来获得我期望的结果。谢谢您的帮助。
查看完整描述

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

我尝试测试如何在链式赋值中重写值与 .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 ”(由链式选项使用)是否会返回视图或副本(这取决于数组的内存布局,pandas 对此不做任何保证),因此,“ setitem ”(由 .loc 使用)是否会修改 dfmi 或随后立即被丢弃的临时对象。


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


查看完整回答
反对 回复 2022-11-29
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

切片没有反映您在原始数据框中所做的更改的原因是 b/c 您首先创建了切片。

创建切片时,您创建了数据切片的“副本”。您没有直接将两者联系起来。

这里的简短回答是,您有两个选择 1) 首先更改原始 df,然后创建一个切片 2) 不切片,只需使用 .loc 或 iloc 引用原始 df 进行操作


查看完整回答
反对 回复 2022-11-29
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号