如何使用Pandas高效修改海量数据(多表场景优化)
优化方案
核心思路
用 pandas 原生的向量化操作替代低效的 Python 循环和行级 apply,利用索引对齐、透视表(pivot_table)和表连接(join)来大幅提升处理效率。
优化后代码
import pandas as pd # 原始数据初始化 df = pd.DataFrame({'id': [123, 321, 456, 543], 'name': ['xxx', 'yyy', 'zzz', 'www']}) df.set_index('id', inplace=True) df_1 = pd.DataFrame({ 'id': [123, 321, 456, 543], 'name': ['xxx', 'yyy', 'zzz', 'www'], 'complete': ['yes', 'yes', 'yes', 'yes'], 'course_name': ['AA', 'BB', 'AA', 'DD'], 'complete_date': ['1.1', '1.2', '1.1', '1.5'] }) df_1.set_index('id', inplace=True) # 步骤1:筛选已完成课程并生成目标值列 filtered_df1 = df_1[df_1['complete'] == 'yes'].copy() filtered_df1['course_value'] = filtered_df1['complete_date'] + 'yes' # 步骤2:透视表转换,将课程名转为列,id作为索引 # 用pivot_table处理可能存在的重复id-课程对(取最后一条记录) pivoted_courses = filtered_df1.pivot_table( index=filtered_df1.index, columns='course_name', values='course_value', aggfunc='last' ) # 步骤3:通过索引对齐合并到原始df df_updated = df.join(pivoted_courses) print(df_updated)
优化点说明
- 替换循环与apply:完全移除了行级遍历和自定义函数,改用 pandas 内置的向量化筛选、字符串拼接操作,效率提升几个数量级。
- 透视表重组数据:将
course_name从行转为列,直接生成需要新增的列结构,避免了手动创建字典和循环赋值。 - 索引连接:利用
id作为两个表的索引,通过join实现高效的对齐匹配,替代了原代码中df.loc[df['name'] == name]这种O(n)级别的查找。 - 处理重复数据:用
pivot_table的aggfunc='last'自动处理同一用户同一课程的多条记录,确保结果与原逻辑一致。
多工作表场景扩展
如果需要处理多个类似df_1的工作表,可以先将所有工作表的数据合并到同一个DataFrame中,再执行上述步骤:
# 假设sheets是包含多个df_1类DataFrame的列表 all_course_data = pd.concat(sheets) # 后续筛选、透视、合并步骤与上述一致
内容的提问来源于stack exchange,提问作者kkk su
相关产品推荐
相关产品推荐

