如何在Pandas中合并DataFrame且不复制df2的col3数据?
如何在Pandas中关联DataFrame且避免重复复制关联列数据
我有两个DataFrame:
- df1:col1是唯一ID,但col2存在重复值
- df2:col2是唯一ID,包含对应的col3数据
需要将两者关联得到df3,要求不重复复制df2的col3数据——目前用pd.merge会导致col3数据被多次复制,内存占用过高,即使加copy=False也无效。
示例数据
import pandas as pd # df1示例数据 df1 = pd.DataFrame({ 'col1': ['a', 'b', 'c', 'd', 'e'], 'col2': ['A', 'A', 'B', 'C', 'B'] }) # df2示例数据 df2 = pd.DataFrame({ 'col2': ['A', 'B', 'C'], 'col3': ['Albert is the best', 'Bernard is cool', 'Conrad is ok'] }) # 期望得到的df3(col3仅引用df2的数据,不复制) # col1 col2 col3 # 0 a A Albert is the best # 1 b A Albert is the best # 2 c B Bernard is cool # 3 d C Conrad is ok # 4 e B Bernard is cool
当前代码(内存占用高,存在数据复制)
df3 = pd.merge(df1, df2, on='col2', how='left')
解决方案
方法1:用分类数据类型减少内存占用
把df2的col2作为分类标签,通过分类编码映射col3,实现数据共享:
# 将df2的col2设为索引,方便映射 df2 = df2.set_index('col2') # 把df1的col2转为分类类型,关联df2的索引作为分类项 df1['col2'] = pd.Categorical(df1['col2'], categories=df2.index) # 通过分类编码直接映射df2的col3,此时col3共享df2的数据 df1['col3'] = df2['col3'].iloc[df1['col2'].codes].values df3 = df1
这种方式下,相同的col3值不会重复存储,只会存储分类编码,内存占用大幅降低。
方法2:结合索引与join实现关联
通过设置df2的索引为col2,再用join关联,减少数据复制:
# 将df2的col2设为索引 df2_idx = df2.set_index('col2') # 关联col3,此时col3为df2数据的引用(部分Pandas版本下可避免复制) df3 = df1.join(df2_idx['col3'], on='col2')
方法3:用Numpy视图实现底层数据共享
直接通过索引映射创建共享内存的数组,彻底避免复制:
import numpy as np # 生成col2到col3的索引映射 col2_indices = df2.set_index('col2').index.get_indexer(df1['col2']) # 基于索引映射创建共享内存的col3列 df3 = df1.copy() df3['col3'] = df2['col3'].values[col2_indices]
这里df3['col3']是df2['col3'].values的视图,不会额外复制数据,内存占用仅为索引数组的大小。
内容的提问来源于stack exchange,提问作者Cassayre Valentin
相关产品推荐
相关产品推荐

