如何用从1起始的连续自然数按序填充数据帧中的Nan值?
实现方案
顺着你现有fillna写法的入参配置
你写的df['Columns'] = df['Columns'].fillna(xxx)的写法完全可行,只要把xxx换成和列长度匹配、从1开始的连续自然数序列就行,完整代码是:
df['Columns'] = df['Columns'].fillna(range(1, len(df) + 1))
这里的逻辑很简单:fillna的第一个填充参数,既可以传单个固定值做全局统一替换,也可以传和原列索引对齐的序列,逐行匹配填充值。你现在的目标列全为NaN,生成的range(1, len(df)+1)长度刚好和列一致,默认行索引和原df的0、1、2、3行完全对齐,能把每个位置的NaN替换成从1递增的连续数,完全匹配预期效果。
更省事的等价写法
因为你现在的目标列全是NaN,根本没必要走fillna判断哪些位置是空值的冗余逻辑,直接整列赋值就行,代码更短跑得还快:
df['Columns'] = range(1, len(df) + 1)
跑出来的结果和预期完全一样,Columns列逐行就是1、2、3、4。
通用场景补充
如果之后遇到不是全列空、只有部分位置是空值的情况,也想给这些空值按顺序填从1开始的连续数、保留原来的非空值,只要把填充序列的索引和空值所在的行号对齐再传给fillna就行:
# 找出所有空值的行索引 na_row_idx = df.loc[df['Columns'].isna(), 'Columns'].index # 生成和空值数量匹配的连续自然数,绑定对应空值的行索引 fill_series = pd.Series(range(1, len(na_row_idx) + 1), index=na_row_idx) # 执行填充 df['Columns'] = df['Columns'].fillna(fill_series)
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

