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

