如何用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] })
方法一:逐行匹配(直观易懂,适合小数据集)
- 拆分数据为有有效值的行和缺失值的行
- 对每个缺失行,在同
type分组内计算与其他行的价格差,取差值最小的product填充 - 合并数据并恢复原顺序
# 分离有值和缺失行 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
相关产品推荐
相关产品推荐

