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

如何从两个已有Pandas DataFrame生成新列并保留原数据

Pandas大表左连接补充县信息方案

核心实现思路

要保留A的全部1.1亿行数据,同时通过B补充对应的county列,用**左连接(left join)**是最直接的方案——它会匹配A和B中相同的identifier值,把B的county列对应过来;A中找不到匹配的行,county列会自动填充为NaN。

基础代码

import pandas as pd

# 执行左连接,on指定连接键,how='left'强制保留A的所有行
merged_df = pd.merge(A, B, on='identifier', how='left')

针对大表的优化建议

因为A的数据量高达1.1亿行,直接合并可能遇到内存不足或速度慢的问题,推荐以下优化手段:

1. 确保B的映射关系唯一

B是标识符到县的全量映射,理论上identifier应该是唯一的,如果有重复会导致合并后数据膨胀,先做检查和去重:

# 检查B中identifier是否存在重复值
if not B['identifier'].is_unique:
    # 去重,保留首次出现的映射(可根据需求调整keep参数)
    B = B.drop_duplicates(subset='identifier', keep='first')

# 合并时添加validate参数,强制验证多对一关系,提前发现数据问题
merged_df = pd.merge(A, B, on='identifier', how='left', validate='m:1')

2. 优化内存占用

如果identifier是字符串类型,转为category类型能大幅节省内存:

# 将A和B的identifier列转为category类型
A['identifier'] = A['identifier'].astype('category')
B['identifier'] = B['identifier'].astype('category')

# 再执行合并操作
merged_df = pd.merge(A, B, on='identifier', how='left')

3. 分块处理(内存不足时)

如果机器内存不足以一次性加载1.1亿行数据,可以分块读取A,逐块合并后再拼接:

chunk_size = 1_000_000  # 每次处理100万行,可根据内存情况调整
output_list = []

# 假设A存储在csv文件中,分块读取
for chunk in pd.read_csv('A_data.csv', chunksize=chunk_size):
    # 单块数据执行合并
    chunk_merged = pd.merge(chunk, B, on='identifier', how='left')
    output_list.append(chunk_merged)

# 合并所有分块得到最终结果
merged_df = pd.concat(output_list, ignore_index=True)

处理缺失值(可选)

如果A中存在B没有的identifier,合并后county列会是NaN,可根据需求填充默认值:

# 将空值填充为"未知",可替换为其他符合业务的默认值
merged_df['county'] = merged_df['county'].fillna('未知')

内容的提问来源于stack exchange,提问作者TheMaffGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:40:47