我想在不复制数据的情况下连接两个pandas数据帧。也就是说,我希望连接的数据帧是两个原始数据帧中数据的视图。我试过使用concat(),但没有成功。此代码块显示更改基础数据会影响连接的两个数据帧,但不会影响连接的数据帧:
arr = np.random.randn(12).reshape(6, 2)
df = pd.DataFrame(arr, columns = ('VALE5', 'PETR4'), index = dates)
arr2 = np.random.randn(12).reshape(6, 2)
df2 = pd.DataFrame(arr, columns = ('AMBV3', 'BBDC4'), index = dates)
df_concat = pd.concat(dict(A = df, B = df2),axis=1)
pp(df)
pp(df_concat)
arr[0, 0] = 9999999.99
pp(df)
pp(df_concat)
这是最后五行的输出。将新值分配给arr[0,0]后,df改变;df_concat不受影响。
In [56]: pp(df)
VALE5 PETR4
2013-01-01 -0.557180 0.170073
2013-01-02 -0.975797 0.763136
2013-01-03 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442
2013-01-06 -0.323640 0.024857
In [57]: pp(df_concat)
A B
VALE5 PETR4 AMBV3 BBDC4
2013-01-01 -0.557180 0.170073 -0.557180 0.170073
2013-01-02 -0.975797 0.763136 -0.975797 0.763136
2013-01-03 -0.913254 1.042521 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442 -1.259005 1.448442
2013-01-06 -0.323640 0.024857 -0.323640 0.024857
In [58]: arr[0, 0] = 9999999.99
In [59]: pp(df)
VALE5 PETR4
2013-01-01 9999999.990000 0.170073
2013-01-02 -0.975797 0.763136
2013-01-03 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442
2013-01-06 -0.323640 0.024857
In [60]: pp(df_concat)
A B
VALE5 PETR4 AMBV3 BBDC4
2013-01-01 -0.557180 0.170073 -0.557180 0.170073
2013-01-02 -0.975797 0.763136 -0.975797 0.763136
2013-01-03 -0.913254 1.042521 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442 -1.259005 1.448442
2013-01-06 -0.323640 0.024857 -0.323640 0.024857
我想这意味着concat()创建了数据的副本。有没有办法避免复制?(我想尽量减少内存使用)。
另外,有没有一种快速的方法来检查两个数据帧是否链接到同一个底层数据?(缺少更改数据和检查每个数据帧是否已更改的麻烦)
谢谢你的帮助。
四季酒店
你不能(至少很容易)。当您调用
concat
时,最终会调用np.concatenate
。见this answer explaining why you can't concatenate arrays without copying。不足之处在于,不能保证数组在内存中是连续的。
这里有一个简单的例子
输出:
尽管
x
和y
共享相同的base
,即a
,concatenate
(因此vstack
)不能假定它们是这样做的,因为通常需要连接任意跨步的数组。您可以轻松地生成两个具有不同跨步的阵列,共享相同的内存,如下所示:
输出:
这就是为什么会发生以下情况:
编辑:在
df1.dtype != df2.dtype
不会复制时使用pd.merge(df1, df2, copy=False)
(或df1.merge(df2, copy=False)
)。否则,复制一份。相关问题 更多 >
编程相关推荐