如何用Pandas基于Model与Year列填充Price列的NaN值
解决思路与代码实现
一、优先级1:用相同model+year组合的有效值填充NaN
对于存在相同model和year组合的NaN值,可通过分组填充,用该组内已有的非空price值替换NaN。由于同一model+year组合的price应保持一致,直接取分组内的任意有效值即可。
代码实现:
import pandas as pd import numpy as np # 构造示例数据集 data = { 'model': ['Honda', 'Yamaha', 'Honda', 'Yamaha', 'Bajaj', 'Bajaj', 'Honda', 'Honda'], 'year': [2016, 2017, 2018, 2017, 2015, 2015, 2019, 2017], 'price': [5.0, 5.5, 5.7, np.nan, 6.5, np.nan, 7.0, np.nan] } df = pd.DataFrame(data) # 按model+year分组,用组内非空值填充NaN df['price'] = df.groupby(['model', 'year'])['price'].transform( lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x ) print(df)
执行后输出:
model year price 0 Honda 2016 5.0 1 Yamaha 2017 5.5 2 Honda 2018 5.7 3 Yamaha 2017 5.5 4 Bajaj 2015 6.5 5 Bajaj 2015 6.5 6 Honda 2019 7.0 7 Honda 2017 NaN # 该组合无有效值,留待后续处理
二、优先级2:用同model的最近年份price填充(可选)
若存在model+year组合完全无有效值的情况(如示例中的Honda 2017),可按model分组后,对year排序,通过前后填充或时间插值补全NaN。
方法1:前后填充(优先取相邻年份值)
# 按model和year排序,再用前向+后向填充覆盖剩余NaN df = df.sort_values(['model', 'year']) df['price'] = df.groupby('model')['price'].apply(lambda x: x.ffill().bfill())
此方法会让Honda 2017的price填充为2016年的5.0(前向填充优先)。
方法2:时间插值(基于年份间隔加权)
# 按model分组后,基于年份做线性插值,更贴合时间序列逻辑 df['price'] = df.groupby('model').apply( lambda x: x.set_index('year')['price'].interpolate(method='time') ).reset_index(level=0, drop=True)
此方法会计算Honda 2017的price为(5.0+5.7)/2=5.35,更精准匹配年份间隔。
注意事项
- 上述方法适配1000行以上数据集,pandas的分组与变换操作效率较高,无性能瓶颈。
- 若同一
model+year组合存在多个不同非空price值,需先做数据清洗(如取均值、众数),再执行填充。
内容的提问来源于stack exchange,提问作者Muhammad Haris
相关产品推荐
相关产品推荐

