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

'float' object is not subscriptable错误:DataFrame循环取列表元素失败

问题排查:DataFrame列表元素取值时触发"'float' object is not subscriptable"错误

问题背景

尝试从DataFrame df指定位置的列表中提取索引为4的元素,编写代码如下:

trialoutcomes = []

for j in range(0,len(df.columns)):
    for i in range(5,len(df)):
        trialoutcome = df.loc[i,j]
        trialoutcomes.append(trialoutcome[4])

但持续报错:'float' object is not subscriptable。

单独测试单个位置时可正常得到预期结果:

easy = df.loc[5,0]
print(easy[4])
# 输出:fullMiss

执行df.loc[5,0]返回有效列表:

['trial', '2:7|2:8|4:1|4:2|8:3|8:4|', '4:7', '4:7', 'fullMiss', '5.828', '11', '37', '66']

DataFrame前10行数据如下:

0   ...                                                 77
5   [trial, 2:7|2:8|4:1|4:2|8:3|8:4|, 4:7, 4:7, fu...  ...  [trial, 7:4|7:5|2:2|3:2|2:7|2:8|, 4:3, 3:4, fu...
6   [trial, 2:3|3:3|7:6|8:6|3:7|3:8|, 2:7, 2:7, ne...  ...  [trial, 4:8|5:8|7:3|8:3|2:2|3:2|, 6:2, 6:2, ne...
7   [trial, 3:6|4:6|1:1|1:2|5:2|6:2|, 3:7, 4:6, hi...  ...  [trial, 5:5|5:6|3:1|4:1|1:6|1:7|, 6:7, 7:8, fu...
8   [trial, 8:5|8:6|1:7|1:8|7:1|8:1|, 2:2, 2:1, fu...  ...  [trial, 3:3|4:3|2:7|2:8|6:7|7:7|, 4:6, 3:6, ne...
9   [trial, 5:8|6:8|4:3|5:3|9:2|9:3|, 5:3, 5:3, hi...  ...  [trial, 7:2|7:3|1:4|1:5|5:7|6:7|, 3:4, 4:5, fu...
10  [trial, 1:5|2:5|6:2|7:2|8:7|9:7|, 2:5, 1:6, ne...  ...  [trial, 7:2|7:3|1:1|2:1|5:7|6:7|, 5:8, 5:9, fu...
11  [trial, 2:2|2:3|4:7|5:7|8:2|8:3|, 4:2, 5:3, fu...  ...  [trial, 1:3|2:3|5:8|5:9|9:2|9:3|, 5:6, 4:5, fu...
12  [trial, 2:2|2:3|5:9|6:9|8:2|8:3|, 6:5, 7:6, fu...  ...  [trial, 2:3|2:4|7:4|7:5|8:9|9:9|, 6:8, 6:9, fu...
13  [trial, 2:4|3:4|8:8|9:8|7:2|8:2|, 8:8, 8:9, ne...  ...  [trial, 2:2|3:2|7:7|7:8|7:3|8:3|, 4:5, 4:5, fu...
14  [trial, 7:5|8:5|3:4|3:5|6:9|7:9|, 7:4, 7:3, fu...  ...  [trial, 6:3|6:4|3:9|4:9|2:2|2:3|, 4:8, 4:9, hi...

问题根源

报错说明循环内的df.loc[i,j]返回的不是列表,而是float类型(几乎可以确定是NaN缺失值)。也就是说,你的DataFrame并非所有位置都存储着列表,存在缺失值;当循环到这些位置时,对NaN(float类型)执行[4]下标操作,就会触发该错误。单独测试df.loc[5,0]正常,只是因为这个位置恰好是有效列表。

解决方案

方案1:循环内添加类型校验

在取值前先判断元素是否为可下标访问的列表类型,跳过无效值:

trialoutcomes = []

for j in range(0, len(df.columns)):
    for i in range(5, len(df)):
        trialoutcome = df.loc[i,j]
        if isinstance(trialoutcome, list):
            trialoutcomes.append(trialoutcome[4])
        else:
            # 可选:添加缺失值占位符,比如None
            trialoutcomes.append(None)

方案2:用矢量化操作替代嵌套循环(更高效)

避免低效的嵌套循环,直接对整个DataFrame应用处理逻辑,同时兼容缺失值:

# 定义提取函数:列表取第4个元素,非列表返回None
def get_fifth_element(x):
    return x[4] if isinstance(x, list) else None

# 对所有元素应用函数,转成一维列表
trialoutcomes = df.applymap(get_fifth_element).stack().tolist()

如果仅需处理第5行及以后的数据,可先切片再处理:

trialoutcomes = df.loc[5:].applymap(get_fifth_element).stack().tolist()

验证方法

可以先定位DataFrame中所有非列表元素的位置,确认问题源头:

# 生成非列表元素的掩码
non_list_mask = df.applymap(lambda x: not isinstance(x, list))
print("非列表元素位置:")
print(non_list_mask[non_list_mask].stack())

内容的提问来源于stack exchange,提问作者Caledonian26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:31:02