基于循环迭代创建pandas新列时出现NaN值问题求助
问题原因
- 索引不匹配:你自行构建的
ageDataFrame使用默认的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
相关产品推荐
相关产品推荐

