You need to enable JavaScript to run this app. 基于循环迭代创建pandas新列时出现NaN值问题求助
优惠活动
大模型
产品
解决方案
定价
更多

基于循环迭代创建pandas新列时出现NaN值问题求助

问题原因

  • 索引不匹配:你自行构建的age DataFrame使用默认的0起始连续索引,但原df_new的索引是非连续的(从你输出的结果可以看到索引为1、4、5这类跳号值),pd.concat按行拼接时默认按索引对齐,二者索引无法匹配的位置就会生成NaN值。
  • 空值漏处理:你将age列转为可空的Int64类型,若该列本身存在空值,循环中所有判断条件都无法触发,不会给usia列表追加元素,导致usia长度与df_new行数不一致,进一步加重错位问题。
  • 冗余操作失误:你完全不需要通过pd.concat+reindex的方式新增列,多余的索引重排操作放大了索引不匹配的问题。

修复方案

推荐直接使用pd.cut实现年龄分组,不需要循环,自动对齐原DataFrame索引,不会出现错位问题,代码效率也更高:

import pandas as pd

# 定义分组边界和对应标签,right=False表示区间左闭右开,完全匹配你原有判断逻辑
bins = [0, 17, 31, 46, 60, 75, float('inf')]
labels = ['under_age', 'dewasa_awal', 'dewasa_akhir', 'lansia_awal', 'lansia', 'lansia_akhir']
df_new['kel_usia'] = pd.cut(df_new['age'], bins=bins, labels=labels, right=False)

如果要修复你原有写法的问题,调整如下即可:

df_new['age'] = df_new['age'].astype('Int64')
usia = []
for i in df_new['age']:
    # 先处理空值情况
    if pd.isna(i):
        usia.append(pd.NA)
        continue
    if i < 17:
        usia.append('under_age')
    elif i < 31:
        usia.append('dewasa_awal')
    elif i < 46:
        usia.append('dewasa_akhir')
    elif i < 60:
        usia.append('lansia_awal')
    elif i < 75:
        usia.append('lansia')
    else:
        usia.append('lansia_akhir')
# 直接赋值新增列,自动对齐索引,不需要concat
df_new['kel_usia'] = usia

内容的提问来源于stack exchange,提问作者Handri Mauludin Maulana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 04:36:07