Python pandas for循环生成CREATIVE_SIZE列出现大量NAN值排查
Pandas生成匹配尺寸列出现NaN的排查与修复
核心问题成因
- 代码逻辑上
creative_size列表所有分支(含else兜底)均返回字符串,列表内不可能存在空值,出现NaN90%以上概率是索引对齐问题 - 原始
df如果经过过滤、拼接、去重等操作,索引不是从0开始的连续整数(比如索引为[0,1,3,4,6]),此时创建pd.Series(creative_size)时,默认生成的索引是[0,1,2,3,4,...,n-1] - 执行
df.insert()时,Pandas会按索引值对齐而非按行位置对齐,sizes中未被原始df索引匹配到的行,就会被自动填充为NaN - 次要可能原因:循环处理
CREATIVE_NAME列中的NaN值时触发类型错误,异常被静默吞掉,导致creative_size列表长度小于df行数,对齐时同样会出现NaN
排查步骤
- 验证df索引连续性:运行
list(df.index) == list(range(len(df))),若返回False则确认是索引对齐问题 - 验证列表长度匹配:运行
len(creative_size) == len(df),若返回False说明循环过程存在漏append的情况 - 验证原始列类型:运行
df['CREATIVE_NAME'].isna().sum(),确认是否存在未处理的缺失值
修复方案
方案1:最小改动(适配现有循环逻辑)
在创建Series时指定和原df完全一致的索引,强制按行匹配:
# 替换原来的sizes = pd.Series(creative_size) sizes = pd.Series(creative_size, index=df.index)
额外说明:也可以在循环前执行df = df.reset_index(drop=True)将索引重置为连续整数,匹配默认的Series索引,但该操作会修改原df索引,优先推荐指定index=df.index的方案。
方案2:优化为向量化实现(更高效率,无对齐问题)
替换原有循环逻辑,使用Pandas内置方法实现,避免循环和索引问题:
import numpy as np # 预定义匹配规则 size_list = [ '320x480', '728x1024', '320x50', '728x90', '300x250', '80x80', '1200x627', '768x1024', '320x420', '768x820' ] # 统一转为字符串避免NaN类型报错,生成匹配条件 name_str = df['CREATIVE_NAME'].astype(str) conditions = [name_str.str.contains(size, regex=False) for size in size_list] # 插入新列 df.insert( loc=0, column='creative_size', value=np.select(conditions, size_list, default='no creative size') )
向量化实现比循环速度快10~100倍,尤其适配大尺寸数据集,且所有行都会被default分支兜底,不会出现NaN。
内容的提问来源于stack exchange,提问作者PiCubed
相关产品推荐
相关产品推荐

