如何将循环结果添加为DataFrame行?现有代码报错求修正
解决DataFrame循环赋值的索引错误问题
我来帮你搞定这个问题~你的代码出现索引错误和每次输出空DataFrame的问题,主要有两个核心原因:
- 初始化的
df是空DataFrame(只有列名,没有任何行),直接用iloc[j,0]赋值会因为行索引不存在抛出错误; - 内层循环的逻辑完全错了——你需要为每个符合条件的
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
相关产品推荐
相关产品推荐

