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

如何用fillna迭代列实现DataFrame的Day列递增1填充NaN?

解决DataFrame中分组递增填充NaN的问题

我明白你的需求:你的Day列有多个以0起始的分组,中间都是NaN,想要把每个分组内的NaN按行依次递增1填充。你之前尝试的fillna方法之所以无效,是因为它把所有NaN都填充成了同一个固定值(最后一行Day值+1),没法实现分组内逐行递增的效果。

下面是具体的解决方案,我们可以通过分组+组内索引的方式来实现:

首先,先构造和你类似的示例数据(方便测试):

import pandas as pd
import numpy as np

data = {
    'Day': [0, np.nan, np.nan, np.nan, np.nan, 0, np.nan, np.nan, np.nan, np.nan],
    'Value': [1.0, 1.6, 1.0, 1.7, 6.0, 9.0, 7.8, 2.5, 1.2, 3.4]
}
df = pd.DataFrame(data)

接下来是核心处理步骤:

# 第一步:创建分组标识——每遇到非NaN的Day,就标记为一个新组的开始
df['group_id'] = df['Day'].notna().cumsum()

# 第二步:对每个分组,用组内的行号(cumcount)来填充NaN
df['Day'] = df.groupby('group_id')['Day'].apply(
    lambda x: x.fillna(x.iloc[0] + x.cumcount())
)

# 清理临时的分组列(可选)
df.drop('group_id', axis=1, inplace=True)

执行完这段代码后,你的DataFrame就会变成你想要的样子:

Day  Value
0  0.0    1.0
1  1.0    1.6
2  2.0    1.0
3  3.0    1.7
4  4.0    6.0
5  0.0    9.0
6  1.0    7.8
7  2.0    2.5
8  3.0    1.2
9  4.0    3.4

为什么这个方法有效?

  • df['Day'].notna().cumsum():这个操作会给每个连续的分组分配唯一ID,比如第一个以0开头的组ID是1,第二个是2,以此类推,帮我们把数据拆分成独立的小分组。
  • groupby('group_id'):把数据按分组ID拆分后,每个分组的第一个元素是0,后面都是NaN。
  • x.cumcount():会给每个分组内的元素生成从0开始的索引,第一个元素是0,第二个是1,第三个是2... 加上分组的起始值(x.iloc[0]就是0),正好实现了分组内逐行递增的填充效果。

你原来代码的问题

你之前写的df.Day.fillna(value = df.iloc[-1]['Day'] + 1, inplace = True),是把所有NaN都填充成了最后一行Day值+1这个固定值,没法区分不同的分组,自然达不到分组递增的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:47:39