Pandas遍历拆分后列遇nan值报错,如何正确检测空值?
问题原因及解决方案
核心问题原因
pd.Series.str.split()处理原始空单元格时,返回的是float类型的nan标量,而非空列表,直接遍历就会抛出TypeError: 'float' object is not iterable- 部分空字符串单元格拆分后会得到
['']这类单元素空列表,传入pd.isna()会返回布尔数组,在if判断时会触发真值歧义的报错 - 原有判断逻辑只打印空值提示,没有加
continue跳过后续遍历步骤,就算检测到空值还是会执行遍历逻辑触发报错
最优解决方法
直接在拆分列之后统一将所有空值、空内容替换为空列表,无需额外写空值判断逻辑,修改后代码如下:
import pandas as pd def main(): file = pd.read_csv('DATA_TABLE_RAW.csv') id_column = file['ID'].str.split('/') id_result = id_column.str.get(3) id_result = id_result.str.split('-') id_result = id_result.str.get(0) # 先填充空值为空字符串再拆分,最后统一转成标准列表格式,空内容直接转为空列表 bucketColumn = file['Bucket'].fillna('').str.split(', ').apply(lambda x: x if x[0] else []) bucket = [''] * len(bucketColumn) for index, column in enumerate(bucketColumn): print(index, column) # 已经统一转成列表,空列表会直接跳过遍历,不会报错 for item in column: if '5a4sd5as4d' in item: bucket[index] += 'Integerity, ' elif 'asdaws8dqw89d4' in item: bucket[index] += 'Resources, ' elif 'awd89qw89d4qw' in item: bucket[index] += 'Class, ' # 后续将处理后的数据保存为excel文件
兼容原有判断逻辑的写法
如果你需要保留单独的空值检测分支,就用如下代码替换原有问题行的判断,注意要加continue跳过后续遍历:
for index, column in enumerate(bucketColumn): print(index, column) # 兼容标量nan、空列表、单元素空列表三种空情况 is_empty = False if pd.api.types.is_scalar(column): is_empty = pd.isna(column) else: is_empty = len(column) == 0 or (len(column) == 1 and column[0] == '') if is_empty: print(index, " is Empty") continue # 必须加continue跳过后面的遍历逻辑 for item in column: # 原有逻辑不变
内容的提问来源于stack exchange,提问作者xGhost
相关产品推荐
相关产品推荐

