熊猫数据框视图vs复制,我怎么知道?

用户名

之间有什么区别:

大熊猫 df.loc[:,('col_a','col_b')]

df.loc[:,['col_a','col_b']]

下面的链接虽然有效,但并未提及后者。都拉一个视图吗?第一个拉视图,第二个拉视图吗?喜欢学习熊猫。

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

谢谢

算了吧

如果您的DataFrame具有简单的列索引,则没有区别。例如,

In [8]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=list('ABC'))

In [9]: df.loc[:, ['A','B']]
Out[9]: 
   A   B
0  0   1
1  3   4
2  6   7
3  9  10

In [10]: df.loc[:, ('A','B')]
Out[10]: 
   A   B
0  0   1
1  3   4
2  6   7
3  9  10

但是,如果DataFrame具有MultiIndex,则可能会有很大的不同:

df = pd.DataFrame(np.random.randint(10, size=(5,4)),
                  columns=pd.MultiIndex.from_arrays([['foo']*2+['bar']*2,
                                                     list('ABAB')]),
                  index=pd.MultiIndex.from_arrays([['baz']*2+['qux']*3,
                                                   list('CDCDC')]))

#       foo    bar   
#         A  B   A  B
# baz C   7  9   9  9
#     D   7  5   5  4
# qux C   5  0   5  1
#     D   1  7   7  4
#     C   6  4   3  5

In [27]: df.loc[:, ('foo','B')]
Out[27]: 
baz  C    9
     D    5
qux  C    0
     D    7
     C    4
Name: (foo, B), dtype: int64

In [28]: df.loc[:, ['foo','B']]
KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (1), lexsort depth (0)'

KeyError表示必须对MultiIndex进行排序。如果我们这样做,那么我们仍然会得到不同的结果:

In [29]: df.sortlevel(axis=1).loc[:, ('foo','B')]
Out[29]: 
baz  C    9
     D    5
qux  C    0
     D    7
     C    4
Name: (foo, B), dtype: int64

In [30]: df.sortlevel(axis=1).loc[:, ['foo','B']]
Out[30]: 
      foo   
        A  B
baz C   7  9
    D   7  5
qux C   5  0
    D   1  7
    C   6  4

这是为什么?df.sortlevel(axis=1).loc[:, ('foo','B')]正在选择第一列级别等于foo,第二列级别等于的列B

相反,df.sortlevel(axis=1).loc[:, ['foo','B']]正在选择第一列级别为foo或的B关于第一列级别,没有B列,但是有两foo列。

我认为Pandas的操作原理是,如果您将其df.loc[...]用作表达式,则应假定df.loc可能正在返回副本或视图。Pandas文档未指定您应该遵循的任何规则。但是,如果您分配表格

df.loc[...] = value

那么您可以信任熊猫来改变df自己。

该文档之所以警告有关视图和副本之间的区别的原因,是为了使您意识到使用以下形式的链分配的陷阱

df.loc[...][...] = value

在这里,Pandasdf.loc[...]首先评估,它可以是视图或副本。现在,如果它是副本,则

df.loc[...][...] = value

正在更改的某些部分的副本df,因此对其df自身没有影响更糟的是,由于没有引用副本,因此对副本的影响也会丢失,因此在赋值语句完成后就无法访问副本,因此(至少在CPython中)垃圾收集。


我不知道一种实用的万无一失的先验方法来确定是否df.loc[...]要返回视图或副本。

但是,有一些经验法则可能有助于指导您的直觉(但请注意,我们在这里讨论实现细节,因此不能保证熊猫将来会以这种方式行事):

  • 如果所得的NDFrame无法表示为基础NumPy数组的基本切片,则它可能是副本。因此,选择任意的行或列将导致复制。选择顺序行和/或顺序列(可以表示为切片)可以返回视图。
  • 如果结果NDFrame具有不同dtypes的列,则df.loc可能会再次返回一个副本。

然而,有一个简单的方法来确定是否x = df.loc[..]是一个视图一个postiori:只需看看是否改变值x影响df如果是,则为视图,否则x为副本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我如何知道熊猫数据框中的重复行?

来自分类Python

我为什么要在熊猫中复制数据框

来自分类Dev

我怎么知道是否存在膨胀视图

来自分类Dev

怎么找 ”?” 熊猫数据框中的值

来自分类Dev

我怎么知道GROUP BY缺少数据?

来自分类Dev

复制熊猫数据框中的数据

来自分类Dev

熊猫:在循环中构造新数据框时出现“返回视图而不是复制”警告

来自分类Dev

在熊猫数据框中删除空格行(我不知道是否行)

来自分类Dev

我怎么知道何时将范围更改传播到视图?

来自分类Dev

我怎么知道一个视图是否被多次调用?

来自分类Dev

重塑我的熊猫数据框

来自分类Dev

复制熊猫数据框中的行

来自分类Dev

复制和修改数据框熊猫

来自分类Dev

复制熊猫数据框和系列

来自分类Dev

在熊猫数据框列之间复制值

来自分类Dev

熊猫| 根据条件复制数据框值

来自分类Dev

HTML,我怎么知道“文本框”的高度?

来自分类Dev

我怎么知道选择框中的可用选项何时更改

来自分类Dev

熊猫更新数据框视图上的索引

来自分类Dev

熊猫数据框的名称包含点-怎么办?

来自分类Dev

这个lambda函数怎么了?熊猫和Python数据框

来自分类Dev

我怎么知道训练数据足以进行机器学习

来自分类Dev

我怎么知道R中遵循什么数据分布?

来自分类Dev

GCM,我怎么知道XMPP数据包的结尾?

来自分类Dev

熊猫vs.Numpy数据框

来自分类Dev

我想迭代更新熊猫数据框

来自分类Dev

将我的字典变成熊猫数据框

来自分类Dev

熊猫:concat数据框和多索引数据框。怎么了?

来自分类Dev

熊猫从其他数据框中复制值