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

Pandas:多列分组后如何基于组内行顺序填充缺失值?

解决方案

你的问题核心是分组维度错误:当前按['candidate', 'pop', 'date']分组时,每个日期单独成组,缺失值所在的组只有自己一行,bfill()/ffill()找不到同组的其他行来填充。正确的做法是按['candidate', 'pop']分组,让同一候选人、同一pop的所有日期数据在一个组内,再按日期排序后填充。

步骤1:修正数据类型与排序

首先将date列转为datetime类型,确保日期顺序正确,避免字符串排序的潜在问题:

import pandas as pd

data = [['Joe Biden', 'a', '2021-10-31', 43],
        ['Donald Trump', 'lv', '2021-10-31', 42],
        ['Joe Biden', 'lv', '2021-10-31', 41],
        ['Joe Biden', 'lv', '2021-11-01', ],
        ['Joe Biden', 'rv', '2021-11-01', 42.5]]
df = pd.DataFrame(data, columns=['candidate', 'pop', 'date', 'avg'])

# 转换日期类型并按分组+日期排序
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['candidate', 'pop', 'date'])

步骤2:分组填充缺失值

按['candidate', 'pop']分组后,使用ffill()向前填充(因为你需要用前一日期的有效值填充后一日期的NaN):

df['avg'] = df.groupby(['candidate', 'pop'])['avg'].ffill()

执行后,Joe Biden、pop为lv、2021-11-01的NaN会被前一日期的41填充,结果如下:

candidate pop       date   avg
0      Joe Biden   a 2021-10-31  43.0
2      Joe Biden  lv 2021-10-31  41.0
3      Joe Biden  lv 2021-11-01  41.0
4      Joe Biden  rv 2021-11-01  42.5
1  Donald Trump  lv 2021-10-31  42.0

步骤3:后续实现同组滚动平均

基于上述分组和排序后的DataFrame,直接在分组内使用rolling()函数即可实现滚动平均。例如计算每组内最近2个日期的滚动平均值:

df['rolling_avg'] = df.groupby(['candidate', 'pop'])['avg'].rolling(window=2, min_periods=1).mean().reset_index(level=0, drop=True)

这里min_periods=1确保即使窗口内只有1个值也能计算,避免出现NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:12:36