基于条件对比从3个DataFrame生成新DataFrame的Pandas实现
实现方法与代码示例
先明确三个DataFrame的关联逻辑:
- df1(网格+植被)和df2(网格+温度)通过经纬度网格关联
- df1和df3(植被+温度阈值)通过植被类型关联
下面用示例数据演示完整步骤,你可以直接替换成自己的真实列名:
1. 模拟示例数据(真实场景可跳过)
import pandas as pd # df1:网格+植被类型 df1 = pd.DataFrame({ '经度': [100.0, 100.0, 101.0, 101.0], '纬度': [20.0, 21.0, 20.0, 21.0], '植被类型': ['森林', '草原', '荒漠', '森林'] }) # df2:网格+温度数据 df2 = pd.DataFrame({ '经度': [100.0, 100.0, 101.0, 101.0], '纬度': [20.0, 21.0, 20.0, 21.0], 'Tmax': [35, 38, 42, 32] }) # df3:植被类型+温度阈值 df3 = pd.DataFrame({ '植被类型': ['森林', '草原', '荒漠'], 'limit_Tmax': [33, 40, 45] })
2. 合并数据,关联所有字段
先把df1和df2按经纬度合并,得到每个网格+植被对应的温度;再和df3合并,拿到对应植被的温度阈值:
# 第一步:合并df1和df2(按经纬度匹配) merged_df = pd.merge(df1, df2, on=['经度', '纬度'], how='left') # 第二步:关联df3的温度阈值(按植被类型匹配) merged_df = pd.merge(merged_df, df3, on='植被类型', how='left')
用
how='left'是为了保留df1里所有的网格和植被数据,避免因匹配不到丢失行。
3. 计算Possible列
用Pandas向量化布尔运算处理,比循环高效得多(适合大型数据集):
# 判断逻辑:Tmax <= limit_Tmax 时为True,否则为False merged_df['Possible'] = merged_df['Tmax'] <= merged_df['limit_Tmax']
最终结果示例
处理后的merged_df结构如下:
| 经度 | 纬度 | 植被类型 | Tmax | limit_Tmax | Possible |
|---|---|---|---|---|---|
| 100 | 20 | 森林 | 35 | 33 | False |
| 100 | 21 | 草原 | 38 | 40 | True |
| 101 | 20 | 荒漠 | 42 | 45 | True |
| 101 | 21 | 森林 | 32 | 33 | True |
注意事项
- 确保三个DataFrame中用于匹配的列名完全一致(比如经纬度列名都是'经度'/'纬度'),不一致的话先修改列名:
df.rename(columns={'旧列名':'新列名'}, inplace=True) - 大型数据集优先用向量化列运算,避免逐行循环或
apply,提升处理速度 - 如果df3存在缺失的植被类型,
merged_df里的limit_Tmax会是NaN,此时Possible也会是NaN,可根据需求用fillna处理
内容的提问来源于stack exchange,提问作者code_error
相关产品推荐
相关产品推荐

