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

Pandas合并两个DataFrame并保留主DataFrame索引的问题

解决方案

核心目标:保留df原有索引,将relations_df中对应每个帖子的keywords按similar_posts里的ID顺序整理成列表,合并到df中。

步骤说明

  1. 将relations_df转换为嵌套字典,快速通过帖子ID和关联ID查找对应keywords。
  2. 遍历df每一行,按similar_posts中的ID顺序提取keywords并组成列表。
  3. 处理可能的缺失值,确保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,返回空列表避免报错。

原代码问题分析

  1. 原代码中left_on='id'错误,df的帖子ID是索引而非列,导致merge操作失败。
  2. 即使将索引转为列,groupby聚合的keywords顺序无法和similar_posts中的ID顺序对应,会造成结果顺序混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:14