Python pandas统计DataFrame列g内字典列表的指定字符串时报float不可迭代错误
报错根源
- 类型错误的直接原因:列g中混入了pandas默认表示空值的
np.nan,这类值的数据类型是float,对float执行'字符串' in 变量的判断时,就会触发「argument of type 'float' is not iterable」的报错。 - 逻辑错误的潜在隐患:就算解决了空值问题,原有代码的匹配逻辑也无法得到正确计数——你直接判断字符串是否在字典列表中,实际是检查字符串是不是列表的直接元素,但目标字符串是嵌套在每个字典的
name键对应的取值里,这种写法永远匹配不到目标内容。
修正后的实现方法
1. 基础循环实现(适配所有场景)
首先要提前初始化计数变量,遍历过程中先跳过非法值,再逐层匹配内容:
# 初始化计数器 c = 0 # Comedy计数 ac = 0 # Action计数 for row in g: # 跳过空值、非列表类型的非法行,直接进入下一轮循环 if not isinstance(row, list): continue # 提取当前行所有字典中的name值,跳过格式异常的字典项 row_genre_names = [item['name'] for item in row if isinstance(item, dict) and 'name' in item] # 按规则计数 if 'Comedy' in row_genre_names: c += 1 elif 'Action' in row_genre_names: ac += 1
2. 高效向量化实现(适合大样本数据)
如果数据量较大,避免写原生循环拖慢速度,可以用pandas内置方法批量处理:
import pandas as pd # 对空值做兼容处理,把缺失值替换成空列表 g_clean = g.fillna('[]').apply(eval) # 批量提取每行中所有字典的name值 row_name_lists = g_clean.apply(lambda x: [item.get('name', '') for item in x]) # 直接求和得到计数结果(布尔值True等价于1,False等价于0) c = row_name_lists.apply(lambda x: 'Comedy' in x).sum() ac = row_name_lists.apply(lambda x: 'Action' in x).sum()
注意:如果列内的列表是字符串形式存储的(也就是看起来是列表结构但实际数据类型是str),才需要加
eval做类型转换;如果本身已经是列表对象,去掉apply(eval)即可,否则会触发额外报错。
遍历每行时不要直接对列表中的字典做无保护的键值访问,遇到格式异常的字典项(比如没有name键)也会触发KeyError报错,提前做存在性判断可以避免这类问题。
内容的提问来源于stack exchange,提问作者Beryl Amend
相关产品推荐
相关产品推荐

