Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用loc方法获取数据帧的视图_Python_Pandas_Dataframe - Fatal编程技术网

Python 使用loc方法获取数据帧的视图

Python 使用loc方法获取数据帧的视图,python,pandas,dataframe,Python,Pandas,Dataframe,我试图使用loc方法获取pandas数据帧的视图,但当我修改原始数据帧时,该视图未按预期工作。 我想使用loc方法提取数据帧的行/切片,以便在对数据帧进行修改时,切片反映更改 让我们看看这个例子: 将熊猫作为pd导入 将numpy作为np导入 df=pd.DataFrame({'ID':np.arange(0,5,2),'a':np.arange(3),'b':np.arange(3)}) df a b 身份证件 0 0 0 2 1 1 4 2 2 现在,我使用loc创

我试图使用
loc
方法获取pandas数据帧的视图,但当我修改原始数据帧时,该视图未按预期工作。
我想使用
loc
方法提取数据帧的行/切片,以便在对数据帧进行修改时,切片反映更改

让我们看看这个例子:

将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({'ID':np.arange(0,5,2),'a':np.arange(3),'b':np.arange(3)})
df
a b
身份证件
0   0   0
2   1   1
4   2   2
现在,我使用loc创建一个切片:

slice1=df.loc[[2],]
切片1
a b
身份证件
2   1   1
然后修改原始数据帧:

df.loc[2,'b']=9
df
a b
身份证件
0   0   0
2   1   9
4   2   2
但不幸的是,我们的切片没有反映出这种修改,因为我希望看到:

slice1
a b
身份证件
2   1   1
我的期望:

ab
身份证件
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(链接[])更受欢迎”

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

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

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

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


这里的简短回答是,您有两个选项1)首先更改原始df,然后创建切片2)不切片,只使用.loc或iloc引用原始df执行操作。数据帧和切片的内存地址不同,因此数据帧中的更改不会反映在切片中-

答案是更改数据帧中的值,然后对其进行切片-


您的意思是,当您更改“df”时,切片1应自动反映更改?我认为那是不可能的。是的,这是在我同意安舒尔的观点中提到的。我相信它的设计是为了反过来工作。你取一个切片,在切片中更改一个值,然后更新原始的df。我想知道,因为我可以用iloc做这种修改:
slice2=df.iloc[1:2,:]
,然后它会在df更新时反映更改。实际上我现在很困惑。我尝试了一些我在“答案”部分分享的东西。无论如何,这不是一个答案,但希望澄清我的疑问。谢谢你的帮助。我已经稍微修改了您的示例,只取了一行:
df2=dfmi.loc[[1],('one','second')]
,然后修改原始df如下:
dfmi.loc[1,('one','second')]='z'
。然后,在
df2
切片中,更改不再可见。。。我也尝试了相反的方法,直接在切片中更改:
df2.loc[1]='z'
,并且更改不会反馈到
dfmi
数据帧。