【问题标题】:Merging dataframes in nested for loops in python在python中的嵌套for循环中合并数据帧
【发布时间】:2017-03-27 06:04:24
【问题描述】:

我收到了许多用 [因素] 和 [日期] 标记的 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_list 中有 12 个不同的数据帧。 我知道我可以合并同一天的数据框

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

但是我怎样才能把它放在循环中呢? 蟒蛇新手。欢迎提出任何建议。

【问题讨论】:

  • 如果 df_list 包含 12 个不同的 df,为什么在这里的示例中只合并前六个?
  • 对不起,我不清楚。我试图合并同一日期的所有六个因素。 df_list包含12个不同的df,前6个属于20160929,后6个属于20160930。

标签: python


【解决方案1】:

考虑在每个循环中重置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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多