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

如何使用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)

优化点说明

  1. 替换循环与apply:完全移除了行级遍历和自定义函数,改用 pandas 内置的向量化筛选、字符串拼接操作,效率提升几个数量级。
  2. 透视表重组数据:将course_name从行转为列,直接生成需要新增的列结构,避免了手动创建字典和循环赋值。
  3. 索引连接:利用id作为两个表的索引,通过join实现高效的对齐匹配,替代了原代码中df.loc[df['name'] == name]这种O(n)级别的查找。
  4. 处理重复数据:用pivot_table的aggfunc='last'自动处理同一用户同一课程的多条记录,确保结果与原逻辑一致。

多工作表场景扩展

如果需要处理多个类似df_1的工作表,可以先将所有工作表的数据合并到同一个DataFrame中,再执行上述步骤:

# 假设sheets是包含多个df_1类DataFrame的列表
all_course_data = pd.concat(sheets)
# 后续筛选、透视、合并步骤与上述一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:08:11