如何连接两个Pandas DataFrame并生成对应描述列?
解决方案
可以通过构建ID-描述映射字典+循环插入列的方式高效实现需求,具体操作如下:
1. 构建ID到描述的映射字典
将df1转换为字典,利用字典O(1)的查找效率,比多次merge操作更高效:
import pandas as pd from numpy import nan # 初始化原始数据 df1 = pd.DataFrame({'ID': {0: 'A', 1: 'B', 2: 'C'}, 'Description': {0: 'Apple', 1: 'Book', 2: 'Cat'}}) df2 = pd.DataFrame({'Name': {0: 'David', 1: 'Ken'},'ID1': {0: 'A', 1: 'B'}, 'ID2': {0: 'C', 1: nan}, 'ID3': {0: 'B', 1: 'C'}}) # 生成ID到Description的映射字典 id_desc_map = df1.set_index('ID')['Description'].to_dict()
2. 循环处理生成并插入描述列
循环遍历ID1/ID2/ID3列,生成对应的描述列,并插入到对应ID列的后方,保证列顺序符合需求:
for i in range(1, 4): id_col = f'ID{i}' desc_col = f'DESC{i}' # 匹配描述,将NaN替换为'Null'(与期望结果一致) df2[desc_col] = df2[id_col].map(id_desc_map).fillna('Null') # 获取ID列的位置,将描述列插入到其下一位 insert_index = df2.columns.get_loc(id_col) + 1 df2.insert(insert_index, desc_col, df2.pop(desc_col))
最终输出结果
运行代码后,df2的输出与你的期望完全一致:
Name ID1 DESC1 ID2 DESC2 ID3 DESC3 0 David A Apple C Cat B Book 1 Ken B Book NaN Null C Cat
方案优势
- 字典映射的查找效率远高于多次
merge,数据量越大性能优势越明显 - 仅循环3次,几乎无性能开销
- 严格保证ID列与对应描述列的相邻顺序,完全匹配需求
内容的提问来源于stack exchange,提问作者Shichimi
相关产品推荐
相关产品推荐

