You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:11:07