Pandas 不复制数据帧
如何避免在创建数据帧时复制提供的字典Pandas 不复制数据帧,pandas,Pandas,如何避免在创建数据帧时复制提供的字典 >>> a = np.arange(10) >>> b = np.arange(10.0) >>> df1 = pd.DataFrame(a) >>> a[0] = 100 >>> df1 0 0 100 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 >>> d
>>> a = np.arange(10)
>>> b = np.arange(10.0)
>>> df1 = pd.DataFrame(a)
>>> a[0] = 100
>>> df1
0
0 100
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
>>> d = {'a':a, 'b':b}
>>> df2 = pd.DataFrame(d)
>>> a[1] = 200
>>> d
{'a': array([100, 200, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])}
>>> df2
a b
0 100 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
如果我仅从a创建数据帧,那么对a的更改将反映在df中(反之亦然)
在提供字典时,有没有办法做到这一点?没有办法“共享”dict并根据dict的更改进行帧更新。copy参数与dict无关,数据总是被复制的,因为它被转换为数据数组 但是,有一种方法可以以有限的方式获得这种类型的动态行为
In [9]: arr = np.array(np.random.rand(5,2))
In [10]: df = DataFrame(arr)
In [11]: arr[0,0] = 0
In [12]: df
Out[12]:
0 1
0 0.000000 0.192056
1 0.847185 0.609028
2 0.833997 0.422521
3 0.937638 0.711856
4 0.047569 0.033282
因此,在构造时,传递的ndarray将是底层numpy数组的视图。根据您对数据帧的操作方式,您可以触发一个副本(例如,如果您指定了一个新列,或者更改了一个列的数据类型)。这也仅适用于单个数据类型的帧。可以在不复制数据的情况下初始化数据帧。要了解如何使用,您需要了解BlockManager,它是DataFrame使用的底层数据结构。它试图将相同数据类型的数据分组在一起,并将它们的内存保存在一个块中——它不像文档中所说的那样充当列中的列如果数据已作为单个块提供,例如从矩阵初始化:
a = np.zeros((100,20))
a.flags['WRITEABLE'] = False
df = pd.DataFrame(a, copy=False)
assert_read_only(df[df.columns[0]].iloc)
。。。然后数据帧通常只引用数据数组
但是,如果您开始使用多个阵列或具有异构类型,那么这将不起作用。
在这种情况下,您可以强制它不合并相同类型的数据列
但是,如果您使用非numpy阵列初始化数据帧,pandas将立即复制它。我完全没有意识到它会这样做。