You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何遍历DataFrame列,用对应周的非空值填充列中的NaN值?

如何遍历DataFrame列,用对应周的非空值填充列中的NaN值?

先看一下你的DataFrame示例:
Sample of the 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值

yearmonthmonth_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

火山引擎 最新活动