You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas基于同类型相近Price填充Product列缺失值?

Pandas按类别内最接近价格填充缺失值

先构造你提供的示例数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'type': ['food', 'food', 'food', 'drink', 'drink', 'drink'],
    'price': [19.0, 12.0, 21.0, 21.0, 10.5, 12.0],
    'product': ['apple', 'egg', np.nan, 'wine', 'soda', np.nan]
})

方法一:逐行匹配(直观易懂,适合小数据集)

  1. 拆分数据为有有效值的行和缺失值的行
  2. 对每个缺失行,在同type分组内计算与其他行的价格差,取差值最小的product填充
  3. 合并数据并恢复原顺序
# 分离有值和缺失行
non_missing = df.dropna(subset=['product']).reset_index(drop=True)
missing = df[df['product'].isna()].reset_index(drop=True)

# 定义填充逻辑
def get_closest_product(row):
    # 筛选同类型的非缺失数据
    group = non_missing[non_missing['type'] == row['type']]
    # 计算价格差绝对值
    group['diff'] = abs(group['price'] - row['price'])
    # 返回价格最接近的product
    return group.loc[group['diff'].idxmin(), 'product']

# 填充缺失值
missing['product'] = missing.apply(get_closest_product, axis=1)

# 合并并恢复原顺序
result = pd.concat([non_missing, missing]).sort_index().reset_index(drop=True)

方法二:用merge_asof(高效,适合大数据集)

merge_asof是Pandas专门用于按最近键匹配的函数,需要先对数据按分组键和匹配键排序:

# 对有值数据按type和price排序
non_missing_sorted = non_missing.sort_values(['type', 'price'])
# 对缺失数据按type和price排序
missing_sorted = missing.sort_values(['type', 'price'])

# 按type分组,匹配最近price对应的product
filled = pd.merge_asof(
    missing_sorted,
    non_missing_sorted,
    on='price',
    by='type',
    direction='nearest'
).rename(columns={'product_y': 'product'})[df.columns]

# 合并并恢复原顺序
result = pd.concat([non_missing, filled]).sort_index().reset_index(drop=True)

运行后得到的结果如下:

type  price product
0   food   19.0    apple
1   food   12.0      egg
2   food   21.0    apple
3  drink   21.0     wine
4  drink   10.5     soda
5  drink   12.0     soda

内容的提问来源于stack exchange,提问作者ubertao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:22:40