You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:36:00