如何高效筛选Pandas DataFrame,按主客场班级提取对应分数?
高效实现班级得分提取的Pandas方案
针对你需要从包含主客场信息的DataFrame中提取每个班级对应得分的需求,绝对不要用循环遍历——Pandas的矢量化操作能在大数据集下提供数倍甚至数十倍的效率提升,具体实现如下:
步骤1:构造初始数据(示例)
import pandas as pd df = pd.DataFrame({ 'Class Home': ['A', 'B', 'C', 'A'], 'Class Away': ['B', 'A', 'A', 'C'], 'Point Home': [2, 4, 6, 8], 'Point Away': [1, 3, 5, 7] })
步骤2:矢量化拆分+合并(最优效率方案)
核心思路是把主客场数据拆成两个独立的子DataFrame,分别重命名列后合并:
# 提取主场班级和对应得分,重命名目标列 home_part = df[['Class Home', 'Point Home']].rename(columns={ 'Class Home': 'Class', 'Point Home': 'Point' }) # 提取客场班级和对应得分,重命名目标列 away_part = df[['Class Away', 'Point Away']].rename(columns={ 'Class Away': 'Class', 'Point Away': 'Point' }) # 合并两个子DataFrame,重置索引 final_df = pd.concat([home_part, away_part], ignore_index=True) # 可选:按班级排序,和你给出的示例结果完全一致 final_df = final_df.sort_values('Class', ignore_index=True)
执行后得到的final_df就是你需要的结果:
| Class | Point | |
|---|---|---|
| 0 | A | 2 |
| 1 | A | 3 |
| 2 | A | 5 |
| 3 | A | 8 |
| 4 | B | 1 |
| 5 | B | 4 |
| 6 | C | 6 |
| 7 | C | 7 |
为什么这个方法高效?
- 循环(
itertuples/iterrows)是逐行进行Python层面的逻辑判断,大数据集下会触发大量的Python-C上下文切换,速度极慢; - 上述方案用Pandas内置的矢量化操作,底层基于C语言实现,直接对整列数据进行处理,完全避免了Python循环的开销,数据量越大,效率优势越明显。
替代简洁方案:用melt函数一步到位
如果你喜欢更简洁的写法,可以用melt函数实现同样的效果:
final_df = df.melt( value_vars=[['Class Home', 'Point Home'], ['Class Away', 'Point Away']], value_name=['Class', 'Point'] ).drop(columns=['variable']).sort_values('Class', ignore_index=True)
内容的提问来源于stack exchange,提问作者crmsn
相关产品推荐
相关产品推荐

