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

如何将循环结果添加为DataFrame行?现有代码报错求修正

解决DataFrame循环赋值的索引错误问题

我来帮你搞定这个问题~你的代码出现索引错误和每次输出空DataFrame的问题,主要有两个核心原因:

  1. 初始化的df是空DataFrame(只有列名,没有任何行),直接用iloc[j,0]赋值会因为行索引不存在抛出错误;
  2. 内层循环的逻辑完全错了——你需要为每个符合条件的i生成一行数据,而不是把同一个i的内容重复写入所有行。

修正后的代码(推荐写法)

Pandas并不推荐逐行循环赋值,我们可以先构建好所有数据的列表,再一次性生成DataFrame,既高效又避免索引问题:

import pandas as pd

list2=[(('ATM',), ('ROA',)), (('ATM',), ('ROE',)), (('ATM',), ('NIM',)), (('ATM',), ('ROA', 'ROE')), (('ATM',), ('ROA', 'NIM'))]
tm_final = {0: 3, 1: 6, 2: 4, 3: 2, 4: 0}

# 第一步:筛选出tm_final中值大于0的索引
valid_indices = [i for i in tm_final if tm_final[i] > 0]

# 第二步:构建每行的数据条目
data_rows = []
for idx in valid_indices:
    data_rows.append({
        'A': idx,
        'B': str(list2[idx]),
        'C': tm_final[idx]
    })

# 第三步:生成目标DataFrame
df = pd.DataFrame(data_rows)
print(df)

更简洁的写法(用列表推导式)

如果想简化代码,可以直接用列表推导式一步生成数据列表:

import pandas as pd

list2=[(('ATM',), ('ROA',)), (('ATM',), ('ROE',)), (('ATM',), ('NIM',)), (('ATM',), ('ROA', 'ROE')), (('ATM',), ('ROA', 'NIM'))]
tm_final = {0: 3, 1: 6, 2: 4, 3: 2, 4: 0}

data_rows = [{'A': i, 'B': str(list2[i]), 'C': tm_final[i]} for i in tm_final if tm_final[i] > 0]
df = pd.DataFrame(data_rows)
print(df)

运行结果

执行后会得到你期望的输出:

A                          B  C
0  0           (('ATM',), ('ROA',))  3
1  1           (('ATM',), ('ROE',))  6
2  2           (('ATM',), ('NIM',))  4
3  3  (('ATM',), ('ROA', 'ROE'))  2

为什么原来的代码不行?

再回头看你的原代码:

  • df=pd.DataFrame(columns=['A','B','C'])创建的是一个没有行的空DataFrame,df.iloc[j,0]尝试访问第j行,但这一行根本不存在,所以会抛出索引错误;
  • 内层的for j in range(totalrows)循环,会把当前i的内容重复写入所有行,完全不符合你“每个符合条件的i对应一行”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:17:46