Pandas合并两个DataFrame并保留主DataFrame索引的问题
解决方案
核心目标:保留df原有索引,将relations_df中对应每个帖子的keywords按similar_posts里的ID顺序整理成列表,合并到df中。
步骤说明
- 将relations_df转换为嵌套字典,快速通过帖子ID和关联ID查找对应keywords。
- 遍历df每一行,按
similar_posts中的ID顺序提取keywords并组成列表。 - 处理可能的缺失值,确保keywords列始终为列表类型。
完整代码
import pandas as pd def addkeywords(df, relations_df): # 把relations_df转成{帖子ID: {关联ID: 关键词列表}}的嵌套字典 rel_mapping = relations_df.groupby('id').apply( lambda group: group.set_index('related_id')['keywords'].to_dict() ).to_dict() # 按similar_posts里的顺序提取对应关键词 df['keywords'] = df.apply( lambda row: [rel_mapping[row.name].get(rid, []) for rid in row['similar_posts']], axis=1 ) # 处理空值,保证keywords始终是列表 df['keywords'] = df['keywords'].apply(lambda x: x if isinstance(x, list) else []) return df # 测试用示例数据 if __name__ == "__main__": # 构造df,索引为帖子ID df = pd.DataFrame({ 'Title': ['Head-1', 'Head-2'], 'similar_posts': [[123046, 1915, 111357], [654, 239]] }, index=[17, 18]) # 构造relations_df relations_df = pd.DataFrame({ 'id': [17, 17, 17, 18, 18], 'related_id': [123046, 1915, 111357, 654, 239], 'keywords': [['key1', 'key2'], ['key1', 'key2', 'key6'], ['key3', 'key4'], ['key4', 'key6', 'key1'], ['key5', 'key2']] }) # 生成结果 result = addkeywords(df, relations_df) print(result)
代码说明
- 嵌套字典
rel_mapping将relations_df结构化,避免重复遍历,提升查找效率。 row.name直接调用df的原有索引(帖子ID),确保关联逻辑正确。dict.get(rid, [])处理similar_posts中不存在的关联ID,返回空列表避免报错。
原代码问题分析
- 原代码中
left_on='id'错误,df的帖子ID是索引而非列,导致merge操作失败。 - 即使将索引转为列,groupby聚合的keywords顺序无法和
similar_posts中的ID顺序对应,会造成结果顺序混乱。
内容的提问来源于stack exchange,提问作者Sniper1999
相关产品推荐
相关产品推荐

