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

Pandas DataFrame高效方案:如何快速计算学生组合总分?

嘿,作为Pandas新手碰到这种性能瓶颈太正常了——iterrows()确实在处理数千条数据时会拉胯,因为它是逐行迭代的,完全没用到Pandas最核心的向量化优势。咱们直接来换个高效的方案,速度能提升几十甚至上百倍!

核心思路:用映射替代逐行搜索

原来的代码里每次循环都要在scores_df里做布尔索引查找,这相当于每次都要扫一遍整个成绩表,数据量大了肯定慢。咱们先把成绩表转成名字→分数的字典,这样查找速度是O(1)的,快到飞起。

具体实现步骤

1. 构建成绩映射字典

先把scores_df转换成字典,用学生名字当键,分数当值:

score_map = scores_df.set_index('Name')['Value'].to_dict()

2. 向量化计算总分

接下来有两种方式,都是比iterrows()高效得多的向量化操作:

方式一:直接列映射后相加(最快!)

如果你的组合表列数固定(比如就是name1/name2/name3),直接对每一列映射分数然后相加:

# 简洁版:直接计算总分,无需单独列
combination_df['total_score'] = combination_df['name1'].map(score_map) + combination_df['name2'].map(score_map) + combination_df['name3'].map(score_map)
方式二:通用版(适配任意列数)

如果组合表的列数不固定(比如可能有更多名字列),可以用apply结合map来批量处理:

# 对每一行的所有名字映射分数后求和
combination_df['total_score'] = combination_df.apply(lambda row: row.map(score_map).sum(), axis=1)

完整测试代码

咱们用你给的测试数据跑一遍看看效果:

import pandas as pd

# 你的测试数据
scores_df = pd.DataFrame({
    'Name': ['Dennis', 'James', 'Leo', 'Joe'],
    'Value': [39.66, 45.38, 40.63, 20.10]
})

combination_df = pd.DataFrame({
    'name1': ['Dennis', 'Leo'],
    'name2': ['James', 'Joe'],
    'name3': ['Leo', 'Dennis']
})

# 构建映射字典
score_map = scores_df.set_index('Name')['Value'].to_dict()

# 计算总分(用方式一的简洁版)
combination_df['total_score'] = combination_df['name1'].map(score_map) + combination_df['name2'].map(score_map) + combination_df['name3'].map(score_map)

print(combination_df)

输出结果:

name1  name2    name3  total_score
0  Dennis  James      Leo       125.67
1     Leo    Joe  Dennis       100.39

为什么这个方法更快?

  • 字典映射是O(1)的查找速度,比每次扫整个DataFrame的布尔索引(O(n))快太多
  • 所有操作都是Pandas的向量化操作,底层用C实现,比Python层面的逐行循环效率高几个量级

内容的提问来源于stack exchange,提问作者R.J. Jackson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:25