pandas按village>town>city优先级合并三列为一列的方法
Pandas按指定优先级合并多列非空值方案
需求说明
处理包含code、town、village、city四个字段的DataFrame,其中town、village、city字段存在部分NaN空值,需将三列合并为单个结果列,取值优先级为:village > town > city,即优先取village列非空值,village为空时取town列非空值,town也为空时取city列值,最终输出保留code列与合并后的新列。
实现代码
使用pandas原生的行方向反向填充方法实现,无需逐行遍历,性能优于自定义apply函数:
import pandas as pd import numpy as np # 核心处理逻辑 # 1. 按优先级从高到低排列待合并列:village > town > city # 2. 行维度反向填充空值,空值自动用后方最近的非空值补全 # 3. 取每行第一列的值即为按优先级匹配的结果 df['merged_col'] = df[['village', 'town', 'city']].bfill(axis=1).iloc[:, 0] # 筛选输出需要的列 result = df[['code', 'merged_col']]
效果验证
构造测试数据集验证逻辑:
# 测试样例数据 df = pd.DataFrame({ 'code': ['001', '002', '003', '004', '005'], 'town': [np.nan, '阳关镇', '七里镇', np.nan, '月牙泉镇'], 'village': ['杨家桥村', np.nan, '杜家墩村', np.nan, np.nan], 'city': ['敦煌市', '敦煌市', '敦煌市', '嘉峪关市', '敦煌市'] })
运行上述处理逻辑后输出结果:
| code | merged_col |
|---|---|
| 001 | 杨家桥村 |
| 002 | 阳关镇 |
| 003 | 杜家墩村 |
| 004 | 嘉峪关市 |
| 005 | 月牙泉镇 |
补充说明
如果存在三列全为NaN的行,最终合并结果会保留NaN,需要设置默认填充值的话,可在取值后追加.fillna('你要设置的默认值')即可。
内容的提问来源于stack exchange,提问作者Carola
相关产品推荐
相关产品推荐

