如何遍历DataFrame列,用对应周的非空值填充列中的NaN值?
如何遍历DataFrame列,用对应周的非空值填充列中的NaN值?
先看一下你的DataFrame示例:
你提到的需求很明确:DataFrame的day/month/year三列对应日期,最后一列C里每个月的每一周都有一个非空值,需要把同周的所有NaN都替换成这个非空值。
你之前尝试的三层循环方法效率很低,而且逻辑上有问题——每次循环都会把所有NaN替换成指定day=3的值,不仅会覆盖之前的修改,还只处理了第一周的情况,没法覆盖所有周。
推荐用Pandas的分组填充来解决,既高效又简洁,步骤如下:
1. (可选)生成日期列(方便更精准的周计算)
如果你的周定义是标准的日历周,可以先把年月日转换成日期格式:
df['date'] = pd.to_datetime(df[['year', 'month', 'day']])
2. 标记每行所属的月内周数
这里分两种情况:
- 如果你是按日期区间划分周(比如1-7号是第1周,8-14号是第2周,以此类推),直接计算:
df['month_week'] = df['day'] // 7 + 1
- 如果你是按标准日历周划分(比如周一到周日为一周,跨月的周算到所在的月),可以用:
df['month_week'] = df['date'].dt.isocalendar().week - df['date'].dt.floor('MS').dt.isocalendar().week + 1
3. 分组填充NaN值
按year、month、month_week分组,用每组的非空值填充整个组的NaN:
# 方法1:取每组第一个非空值填充 df['C'] = df.groupby(['year', 'month', 'month_week'])['C'].transform(lambda x: x.fillna(x.dropna().iloc[0])) # 方法2:因为每组只有一个非空值,用ffill+bfill更简洁 df['C'] = df.groupby(['year', 'month', 'month_week'])['C'].apply(lambda x: x.ffill().bfill())
这样就能自动把每个月对应周的所有NaN都替换成该周的非空值,而且比循环方法快得多,尤其是数据量大的时候。
备注:内容来源于stack exchange,提问作者Hashem Kherfi




