如何高效为temp DataFrame匹配同10列对应的ID(大数据量优化)
问题描述
我有两个DataFrame:
apparentTemperature_id 结构
| id | apparentTemperature | apparentTemperatureMin | ... |
|---|---|---|---|
| 1 | 13 | 9 | ... |
| 2 | 48 | 40 | ... |
| 3 | 32 | 24 | ... |
| ... | ... | ... | ... |
temp 结构
| apparentTemperature | apparentTemperatureMin | ... |
|---|---|---|
| 32 | 24 | ... |
| 13 | 9 | ... |
| 32 | 24 | ... |
| ... | ... | ... |
当前使用的代码如下:
temp = pd.concat([apparentTemperature_df, temperature_df], axis=1) temp_list = [] for i in range (len(temp)): for k in range (len(apparentTemperature_id)): if temp.iloc[i,0:9].equals(apparentTemperature_id.iloc[k,1:10]): temp_list.append(apparentTemperature_id.iloc[k,0]) break
需求是根据apparentTemperature_id为temp数据分配对应的ID,要求完全匹配共10列数据。但数据量达60万+行,ID有1000+个,上述代码运行耗时极长,求更高效的实现方式?
高效解决方案
直接使用pandas内置的merge方法,这是专门为DataFrame匹配合并设计的向量化操作,相比嵌套循环效率提升几个数量级:
步骤说明
- 对齐匹配列名:确保
apparentTemperature_id中除id外的10列,和temp中的10列列名完全一致(如果列名不同,先使用rename方法统一)。 - 执行合并操作:
# 提取用于匹配的列(除id外的所有列) merge_columns = [col for col in apparentTemperature_id.columns if col != 'id'] # 或者直接指定10列的列名列表,比如: # merge_columns = ['apparentTemperature', 'apparentTemperatureMin', ...] # 左合并:保留temp的所有行,匹配对应的id result_df = temp.merge(apparentTemperature_id, on=merge_columns, how='left')
执行后,result_df就是temp数据加上匹配到的id列,完全替代原嵌套循环的逻辑。
效率优势
merge底层基于C实现哈希匹配,避免了Python层面的循环开销,处理60万行数据基本秒级完成。- 自动批量处理所有匹配,无需手动遍历每一行和ID。
内容的提问来源于stack exchange,提问作者Septem 24
相关产品推荐
相关产品推荐

