基于双列表设置Pandas DataFrame值的代码提速优化问询
高效处理75万行DataFrame温度过滤方案
直接放弃遍历,用Pandas向量化操作——这是处理大数据量的核心思路,比循环快几十甚至上百倍。以下是具体步骤:
1. 对齐月份与阈值列表的索引关系
假设你的mintempf_list和maxtempf_list是按月份顺序存储(索引0对应1月,索引1对应2月…索引11对应12月),而DataFrame的MO列是1-12的数值,先把MO转成列表的0基索引:
df['mo_idx'] = df['MO'] - 1
2. 快速映射对应月份的温度阈值
用map或take方法,把每行的月份匹配到对应的温度阈值:
# 方法1:用字典映射,直观易懂 month_min = {i+1: mintempf_list[i] for i in range(12)} month_max = {i+1: maxtempf_list[i] for i in range(12)} min_temp = df['MO'].map(month_min) max_temp = df['MO'].map(month_max) # 方法2:用索引直接取值,数据量极大时略快 min_temp = mintempf_list[df['mo_idx']] max_temp = maxtempf_list[df['mo_idx']]
3. 批量过滤TEMP列
用numpy.where或Pandas原生where方法,一次性完成所有行的条件判断与赋值:
import numpy as np # 定义有效条件:TEMP不为空 且 在当月温度阈值范围内 valid_condition = df['TEMP'].notna() & (df['TEMP'] >= min_temp) & (df['TEMP'] <= max_temp) # 不符合条件的设为np.nan df['TEMP'] = np.where(valid_condition, df['TEMP'], np.nan) # 或者用Pandas的where方法,效果完全一致 # df['TEMP'] = df['TEMP'].where(valid_condition, np.nan)
为什么这方法快?
Pandas的向量化操作是底层用C实现的,不会像Python循环那样逐行解释执行,75万行数据处理下来应该在几秒到几十秒内完成,绝对不会超过1小时。
关于你之前的vectorize报错
numpy vectorize本质还是包装后的循环,效率提升有限,而且如果月份与列表的索引对应关系没处理好(比如MO是1-12但列表是0基),就会触发索引越界错误,远不如直接用上面的向量化方法靠谱。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

