在python的嵌套for循环中合并数据帧

2024-04-18 00:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了许多CSV文件标记为[因子]和[日期]。每个文件包含不同[symbol]的[exposure]。我不合时宜地想要的是,每一天,一个数据帧都包含[symbol]和它们的[factor]。你知道吗

for d in tradedays:
    for f in factor_list:
        file_name='/home/jovyan/multifactor_data/'+str(f)+'/'+str(d)+'.csv'
        if os.path.exists(file_name) and 20160929<=int(d)<=20160930:
            origin_df=pd.read_csv(file_name)
            origin_df=origin_df.loc[:,['symbol','indusMkt1']]
            df_list.append(origin_df)
        else:
            pass

对于这个示例,dfïu列表中有12个不同的数据帧。 我知道我可以合并同一天的数据帧

M_list=df_list[0]
for i in [1,2,3,4,5]:  
    M_list=M_list.merge(df_list[i],on='symbol')

但我怎么才能把它放在循环中呢? python新手。欢迎任何建议。你知道吗


Tags: 文件csv数据namein标记dffor
1条回答
网友
1楼 · 发布于 2024-04-18 00:42:58

考虑在每个循环中重置df_list,并使用reduce(lambda ...)合并列表中的所有数据帧。并考虑使用以tradedays为键的字典来避免全局环境中的许多日常数据帧:

from functools import reduce
import pandas as pd
import os 

dfs = {}                                                  # MERGED DFs DICT
for d in tradedays:
    df_list = []                                          # RESET DF LIST BY DAY
    for f in factor_list:                    
        file_name = os.path.join('/home/jovyan/multifactor_data',str(f),str(d)+'.csv')
        if os.path.exists(file_name) and 20160929 <= int(d) <= 20160930:
            df_list.append(pd.read_csv(file_name)[['symbol','indusMkt1']])

    dfs[d] = reduce(lambda left,right: pd.merge(left, right, on=['symbol']), df_list)

相关问题 更多 >

    热门问题