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

Python中多大型Pandas DataFrame的高效搜索与字符串拼接方案

我之前处理过类似的大规模数据拼接需求,Pandas的向量化操作绝对是解决性能问题的关键——别再用循环或者手动填充字典了,试试下面这套基于Pandas原生操作的方案,10万条数据应该能在几秒内搞定:

高效解决方案:基于Pandas向量化操作+分组拼接

核心思路

跳出逐行处理的思维,利用Pandas内置的merge、groupby、melt等优化操作(底层为C实现),批量完成数据关联与拼接,彻底解决线性搜索的性能瓶颈。


步骤1:预处理关联表(列表A+B)

首先把列表A(item_group表)和列表B(sub_item表)合并,打通item_group -> item_name -> item_value的关联链,同时绑定对应的id:

# 假设你的列表A命名为df_group,列表B命名为df_sub
df_merged = pd.merge(df_group, df_sub, on=['id', 'item_name'], how='inner')

用inner join只保留两边都匹配到的数据,避免无效数据干扰后续处理。

步骤2:预生成(id, item_group)对应的拼接字符串

按id和item_group分组,批量生成每个组内item_name=item_value的拼接内容——这一步是批量处理,比逐行循环效率提升几个数量级:

# 分组并生成每个组的拼接片段
df_grouped = df_merged.groupby(['id', 'item_group']).apply(
    lambda group: ', '.join(f"{row['item_name']} = {row['item_value']}" for _, row in group.iterrows())
).reset_index(name='combined_str')

# 转换成可快速查找的字典(批量生成,而非手动填充)
lookup_map = df_grouped.set_index(['id', 'item_group'])['combined_str'].to_dict()

步骤3:处理main_list生成最终结果

针对main_list中的多个item字段(item2、item3、item4...),提供两种高效处理方式:

方式一:向量化长格式转换(性能最优,推荐)

把main_list从宽格式转成「id + 字段名 + item_group值」的长格式,再和预生成的拼接结果批量合并,最后按id拼接所有有效片段:

# 把main_list转成长格式,指定需要处理的item字段
melted_main = main_list.melt(
    id_vars=['id'],
    value_vars=['item2', 'item3', 'item4'],  # 替换为你的实际item字段列表
    var_name='item_field',
    value_name='item_group_val'
)

# 合并长格式数据与预生成的拼接字符串
merged_main = pd.merge(
    melted_main,
    df_grouped,
    left_on=['id', 'item_group_val'],
    right_on=['id', 'item_group'],
    how='left'
)

# 生成每个item字段的完整拼接片段
merged_main['result_part'] = merged_main.apply(
    lambda row: f"{row['item_field']} = {row['item_group_val']} = {row['combined_str']}" 
    if pd.notna(row['combined_str']) else '',
    axis=1
)

# 按id分组,拼接所有有效片段得到最终结果
final_result = merged_main.groupby('id')['result_part'].apply(
    lambda parts: ', '.join(p for p in parts if p)
).reset_index(name='final_output')

# 将结果合并回原main_list
main_list = pd.merge(main_list, final_result, on='id', how='left')

方式二:逐行apply(代码简洁,适合字段较少的场景)

如果你的item字段数量不多,也可以用apply快速实现,但仅建议在字段数少的情况下使用:

def build_output(row, item_fields):
    parts = []
    for field in item_fields:
        group_val = row[field]
        lookup_key = (row['id'], group_val)
        if lookup_key in lookup_map:
            part = f"{field} = {group_val} = {lookup_map[lookup_key]}"
            parts.append(part)
    return ', '.join(parts)

# 应用到main_list生成最终结果
main_list['final_output'] = main_list.apply(
    lambda row: build_output(row, ['item2', 'item3', 'item4']),
    axis=1
)

额外优化建议

  1. 类型转换优化:如果id和item_group是字符串类型,建议转换成category类型(astype('category')),可大幅减少内存占用,同时加快merge和groupby的速度。
  2. 缺失值处理:如果存在未匹配到的item字段,可在merge时用how='left',再通过fillna('')将空值替换为空字符串,避免结果中出现NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:57:45