Pandas iterrows()循环读取CSV时如何以ISIN值命名独立DataFrame
问题说明
现有存储ETF元信息的DataFrame,样例结构如下:
import pandas as pd etf_list = pd.DataFrame({ 'ISIN':['LU1737652583', 'IE00B44T3H88', 'IE0005042456', 'IE00B1FZS574', 'IE00BYMS5W68'], 'ETF_Vendor':['Amundi', 'HSBC', 'iShares', 'iShares', 'Invesco'] })
本地文件夹ETF/Input/下存储了对应ISIN编号的CSV文件,需要实现逻辑:遍历etf_list时,仅筛选ETF_Vendor字段值为iShares的行,读取对应ISIN的CSV文件生成DataFrame。
原有实现将读取结果存储在df对象中,需要通过df['IE00B1FZS574']的键索引形式访问,目标是直接以ISIN值作为独立变量名访问数据,例如直接输入变量名IE00B1FZS574即可获取对应数据集。
原有存在问题的代码如下:
iShares = [] for i, row in etf_list.iterrows(): if row['ETF_Vendor'] == 'iShares': ISIN = row['ISIN'] iShares.append(ISIN) df[row['ISIN']] = 'ETF/Input/' + row['ISIN'] + '.csv' df[row['ISIN']] = pd.read_csv(df[row['ISIN']], sep=',', skiprows=2, thousands='.', decimal=',') else: pass
实现方案
方案1:动态生成独立全局变量(完全匹配需求)
通过修改Python全局命名空间字典globals(),可以直接将ISIN字符串作为变量名创建对应变量,修改后代码如下:
iShares = [] for i, row in etf_list.iterrows(): if row['ETF_Vendor'] == 'iShares': ISIN = row['ISIN'] iShares.append(ISIN) file_path = f'ETF/Input/{ISIN}.csv' # 动态创建以ISIN为名的全局变量 globals()[ISIN] = pd.read_csv(file_path, sep=',', skiprows=2, thousands='.', decimal=',')
代码运行后,可直接通过IE00B1FZS574、IE0005042456这类变量名直接访问对应DataFrame,无需嵌套索引。
风险提示:该方式会直接修改全局命名空间,若ISIN存在重名、或和已有变量/函数名冲突,会直接覆盖原有内容,适合临时脚本使用,生产环境更推荐方案2。
方案2:字典统一存储(推荐规范实践)
如果不需要强制使用独立变量名,用字典统一管理所有读取到的DataFrame是更安全、易维护的方式:
iShares = [] ishares_df_dict = {} for i, row in etf_list.iterrows(): if row['ETF_Vendor'] == 'iShares': ISIN = row['ISIN'] iShares.append(ISIN) file_path = f'ETF/Input/{ISIN}.csv' ishares_df_dict[ISIN] = pd.read_csv(file_path, sep=',', skiprows=2, thousands='.', decimal=',')
访问时通过ishares_df_dict['IE00B1FZS574']即可获取对应数据,既不会污染全局环境,也方便后续批量遍历所有iShares数据集做统一处理。
内容的提问来源于stack exchange,提问作者Economist Learning Python
相关产品推荐
相关产品推荐

