熊猫:啥是视图?

Posted

技术标签:

【中文标题】熊猫:啥是视图?【英文标题】:Pandas: What is a view?熊猫:什么是视图? 【发布时间】:2017-06-05 12:51:21 【问题描述】:

请帮助我理解:Pandas 中的 view 是什么。 我知道,如果我们更改 view 中的某些内容,我们总是会更改原始对象。

但是一个对象的视图和原始对象有不同的id's,例如。这是否意味着view 是另一个引用原始对象的对象?机制是什么?

我试过了,但找不到解释。

import pandas as pd
import numpy as np

df = pd.DataFrame('x': [1,2])
print(df)
df_sub = df[0:1]
df_sub.x = -1
print(df_sub._is_view)               # True
print(id(df) == id(df_sub))          # False
print(np.shares_memory(df, df_sub))  # True

【问题讨论】:

你能举个例子吗? @cricket_007 确定,秒 查看 this article 和 this post 的 numpy 视图与副本。很多 pandas 要么类似于 numpy,要么实际上是表面下的 numpy,所以这个解释应该适用于你的大部分情况。 如果我理解正确,视图是原始数据的子集...***.com/questions/17960511/… @bunji 谢谢,我已经阅读了这 2 篇文章。但我找不到解释什么是View :) 【参考方案1】:

要了解什么是视图,您必须知道什么是数组。数组不仅是您放入其中的“东西”(项目)。它(除其他外)还需要有关元素数量、数组形状以及如何解释元素的信息。

所以一个数组应该是一个至少包含这些属性的对象:

class Series:
    data    # A pointer to where your array is stored
    size    # The number of items in your array
    shape   # The shape of your array
    dtype   # How to interpret the array

因此,当您创建视图时,会创建一个新数组对象,但(这很重要)视图的 data 指针指向原始数组。它可以是偏移的,但它仍然指向一个属于原始数组的内存位置。但即使它与原始对象共享一些数据,大小、形状、dtype (, ...) 也可能已更改,因此它需要一个新对象。这就是为什么他们有不同的ids。

把它想象成窗户。你有一个花园(数组),你有几个窗户,每个窗户都是一个不同的对象,但它们都看着同一个(你的)花园。好吧,当然,通过一些切片操作,您将拥有更多 escher-like windows,但隐喻总是缺少一些细节 :-)

【讨论】:

也可以将the stride attribute 添加到列表中。 NumPy 数组切片是一种常见的视图,它指向相同的基础数据,但具有不同的步幅(可能还有偏移)。 @unutbu 我同意它们很重要,尤其是在使用步骤进行切片时,但我认为在理解“什么是视图”时它们可能更令人困惑。

以上是关于熊猫:啥是视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中创建数据框视图?

熊猫视图与副本:文档说“没人知道”?

如何在熊猫中做“横向视图爆炸()”[重复]

熊猫:链式作业[重复]

Django 熊猫 AWS

将多个熊猫数据帧作为单个 Django zip 文件返回(每个 DF 一个文件)HttpResponse