优化Pandas含列表列的DataFrame转换,提升批量处理速度
高效优化Pandas对话数据转换方案
针对你用iterrows处理20k行数据耗时5小时的问题,直接上矢量化优化方案,全程避免低效循环:
步骤1:把字符串格式的对话列表转成真实列表
从CSV读进来的messages是字符串格式(比如"['你好', '我是张三', '请问有什么事?']"),先用ast.literal_eval批量解析:
import ast import pandas as pd # 假设原数据框是df df['messages'] = df['messages'].apply(ast.literal_eval)
步骤2:拆分对话列表为单行,保留对应URL
先给原每行加唯一分组标识,再用explode把列表拆成独立行:
# 给原数据的每行加分组ID,方便后续关联上下文 df['group_id'] = df.index # 展开列表,每个对话消息占一行,同时保留url和分组ID expanded_df = df.explode('messages').rename(columns={'messages': 'message'}).reset_index(drop=True)
步骤3:生成prev_message列
按分组ID聚合,用shift(1)取每组内的前一条消息,第一条消息自动补NaN,最后替换成None:
# 组内偏移获取前一条消息 expanded_df['prev_message'] = expanded_df.groupby('group_id')['message'].shift(1) # 将NaN替换为需求的None expanded_df['prev_message'] = expanded_df['prev_message'].where(expanded_df['prev_message'].notna(), None)
步骤4:清理多余列(可选)
不需要分组ID的话直接删掉:
final_df = expanded_df.drop('group_id', axis=1)
为什么这么快?
- 全程用Pandas底层优化的矢量化操作,比
iterrows逐行循环效率高几个数量级 explode和groupby+shift都是C级别的运算,20k行数据处理下来最多几十秒
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

