遍历DataFrame的Age列时跳过NA值并生成Is_age列的解决方案求助
问题描述
需要遍历DataFrame的Age列,根据Age值的位数判断生成新列Is_age:
- 位数大于2 →
Is_age设为'No' - 位数≤2 →
Is_age设为'Yes' - 空值(NA)→
Is_age设为'other'
示例数据:
Age 23 25 <NA> 28 <NA>
尝试的代码:
Count=0 for i, j in df['Age'].iterrows(): if j==None: df['Is_age']=='other' else: while(j!=None): for k in j: Count+=1 if(Count>2): df['Is_age']=='No' else: df['Is_age']=='Yes'
报错信息:
TypeError: 'NAType' object is not iterable
解决方案
方法一:向量化操作(推荐,高效简洁)
Pandas的核心优势是向量化操作,避免手动循环,代码更高效易维护:
import pandas as pd # 构造示例数据 df = pd.DataFrame({'Age': [23, 25, pd.NA, 28, pd.NA]}) # 1. 初始化新列为空值对应的'other' df['Is_age'] = 'other' # 2. 筛选非空值行,判断位数并赋值 non_na_mask = df['Age'].notna() df.loc[non_na_mask, 'Is_age'] = df.loc[non_na_mask, 'Age'].astype(str).str.len().apply(lambda x: 'No' if x>2 else 'Yes')
运行结果:
Age Is_age 0 23 Yes 1 25 Yes 2 NaN other 3 28 Yes 4 NaN other
方法二:手动循环(仅作理解用,不推荐)
如果一定要用循环,修正后的代码如下:
import pandas as pd df = pd.DataFrame({'Age': [23, 25, pd.NA, 28, pd.NA]}) df['Is_age'] = '' # 初始化新列 for idx, age in df['Age'].items(): if pd.isna(age): df.loc[idx, 'Is_age'] = 'other' else: # 转字符串后判断长度 age_str = str(age) df.loc[idx, 'Is_age'] = 'No' if len(age_str) > 2 else 'Yes'
关键修正说明
- 用
pd.isna()判断Pandas空值,替代j==None(Pandas空值为pd.NA,不是Python原生None) - 将数值转为字符串后用
len()判断位数,避免直接遍历数值的错误 - 用
df.loc[idx, 'Is_age']给指定行赋值,替代原代码中错误的比较操作(==) - 移除多余的
while循环和全局Count变量,保证每行独立判断
内容的提问来源于stack exchange,提问作者Shital
相关产品推荐
相关产品推荐

