如何从两个已有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
相关产品推荐
相关产品推荐

