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
相关产品推荐
相关产品推荐

