2016-11-13 35 views
0

我得到了很多由[factor]和[date]標記的CSV文件。每個文件都包含[曝光]不同的[符號]。我非常需要的是每天都有一個數據框包含[符號]及其[因子]。這是我嘗試過的。在python中嵌套for循環合併數據幀

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') 

合併在同一天的數據幀,但我怎麼能放進了循環? python的新功能。任何建議都是值得歡迎的。

+0

如果* df_list *包含12個不同的DFS,例如爲什麼在這裏你只合並前六? – Parfait

+0

對不起,我不清楚。我試圖合併同一天的所有六個因素。 df_list包含12個不同的dfs,前6個屬於20160929,後6個屬於20160930。 –

回答

0

考慮在每個循環內重置df_list並使用reduce(lambda ...)合併列表中的所有數據幀。並考慮使用字典,tradedays作爲鍵,以避免許多日常dataframes在全球環境:

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)