You need to enable JavaScript to run this app. Python pandas统计DataFrame列g内字典列表的指定字符串时报float不可迭代错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 00:24:05