如何借助iShares列表动态拼接多个同结构pandas DataFrame
问题原因
你报错的核心原因有两个:
- 你生成的
Lookup_Sector_list里存的是DataFrame的名字字符串,不是DataFrame对象本身,pd.concat()无法直接处理字符串 - 用
for i in 列表遍历的时候,i直接就是列表里的元素(也就是你存的名字字符串),不是列表的整数索引,你写Lookup_Sector_list[i]相当于用字符串当列表下标,自然触发TypeError: list indices must be integers or slices, not str
可直接运行的解决方案(适配你现有代码逻辑)
如果你已经提前定义好了所有Lookup_Sector_xxx格式的独立DataFrame变量,可以通过Python内置的globals()字典动态取出对应名字的变量对象,再统一拼接,不需要硬编码所有变量名:
import pandas as pd # 你原有的iShares列表保持不变 iShares = ['IE0005042456', 'IE00B1FZS574', 'IE00B0M62Q58', 'IE00BF4RFH31', 'IE0031442068', 'IE00BGL86Z12', 'IE00BD45KH83'] # 收集所有对应的DataFrame对象 df_collection = [] for code in iShares: df_name = f"Lookup_Sector_{code}" # globals()存储了所有全局变量,键是变量名字符串,值是变量本身 df_collection.append(globals()[df_name]) # 一次性完成拼接,加ignore_index=True可以重置拼接后DataFrame的索引,避免索引重复 Lookup_Sector = pd.concat(df_collection, ignore_index=True)
也可以写成列表推导式的形式,更简洁:
Lookup_Sector = pd.concat( [globals()[f"Lookup_Sector_{code}"] for code in iShares], ignore_index=True )
更推荐的规范写法
如果你还在生成这些Lookup_Sector_xxx变量的阶段,不建议把同结构的DataFrame定义成一堆独立的全局变量,更好的方式是从一开始就把它们存在字典里,后续处理更方便,也不需要动态取变量:
# 初始化字典存储所有板块DataFrame sector_df_map = {} for code in iShares: # 这里替换成你生成单个DataFrame的实际逻辑,比如读文件、拉接口数据等 # 示例:df = pd.read_excel(f"sector_{code}.xlsx") sector_df_map[code] = df # 拼接时直接取字典所有值即可 Lookup_Sector = pd.concat(sector_df_map.values(), ignore_index=True)
内容的提问来源于stack exchange,提问作者Economist Learning Python
相关产品推荐
相关产品推荐

