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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:01:00