
本文介绍一种高效、稳健的方法:先按“total”分组计算“area”的中位数,再通过 merge_asof 实现“向下查找最近匹配”的填充逻辑,自动为 nan 值分配最接近且不大于当前 total 的可用中位数。
本文介绍一种高效、稳健的方法:先按“total”分组计算“area”的中位数,再通过 merge_asof 实现“向下查找最近匹配”的填充逻辑,自动为 nan 值分配最接近且不大于当前 total 的可用中位数。
在实际数据分析中,常需根据业务逻辑对缺失值进行条件化填充——而非简单全局均值或前向/后向填充。本例要求:对 area 列中的 NaN,查找 total 值相等或略小(向下就近) 的所有非空 area 记录,取其中位数进行填充。例如:
- 第3行 total=8 → 直接取 total==8 对应的 area 中位数 (51+53)/2 = 52;
- 第4行 total=20 → total==20 无有效 area,则回退至 total≤20 的最大可用组(即 total=8),填入 52;
- 第6行 total=59 → total==59 无 area,回退至 total=56(最近且 ≤59),填入 34。
该逻辑本质上是有序键上的反向近似匹配,pandas.merge_asof() 正为此类场景而生(需确保 key 已排序)。
以下是完整实现步骤:
import pandas as pd
import numpy as np
# 构造示例数据
df = pd.DataFrame({
'total': [5, 8, 8, 8, 20, 56, 59],
'area': [40, 51, 53, np.nan, np.nan, 34, np.nan]
})
# Step 1: 按 total 分组,计算 area 中位数,并剔除全 NaN 组
medians = df.groupby('total')['area'].median().dropna()
# Step 2: 将 medians 转为 DataFrame 并按 total 升序排列(merge_asof 要求)
medians_df = medians.reset_index(name='area_median').sort_values('total')
# Step 3: 对原始 df 中 NaN 行,用 merge_asof 实现“向左最近匹配”
# 注意:需对 total 排序以保证 merge_asof 正确性;此处使用原索引保留顺序
nan_mask = df['area'].isna()
df_to_fill = df[nan_mask].reset_index()[['index', 'total']]
# 向左查找(direction='backward' 或默认 'backward'):找 ≤ 当前 total 的最大 total 对应中位数
filled_series = pd.merge_asof(
df_to_fill.sort_values('total'),
medians_df.sort_values('total'),
on='total',
direction='backward'
).set_index('index')['area_median']
# Step 4: 填充原 DataFrame
df.loc[nan_mask, 'area'] = filled_series
print(df)
输出结果:
total area 0 5 40.0 1 8 51.0 2 8 53.0 3 8 52.0 4 20 52.0 5 56 34.0 6 59 34.0
✅ 关键要点说明:
- merge_asof 默认 direction='backward',即对每个 total 查找 medians_df 中 ≤ 该值的最大 total 对应的中位数,完美契合“向下就近查找”需求;
- 必须对 medians_df 和待填充子集(df_to_fill)均按 total 升序排序,否则匹配失效;
- dropna() 确保只保留有有效中位数的 total 组,避免引入 NaN 干扰;
- 使用 boolean indexing(df.loc[nan_mask, 'area'])精准定位并更新缺失位置,不干扰原有非空值。
⚠️ 注意事项:
- 若最小 total 值也无对应 area 数据(即所有 total ≤ x 均无中位数),merge_asof 将返回 NaN,此时可考虑补充兜底策略(如全局中位数);
- merge_asof 要求连接列(on='total')为数值型且可排序,不支持字符串键的近似匹配;
- 该方法时间复杂度为 O(n log n),远优于嵌套循环,适用于万级及以上数据规模。
此方案兼顾准确性、可读性与性能,是处理“基于邻近分组统计量填充缺失值”问题的标准实践。











