循环遍历并合并具有相同索引、相同列的 DataFrame(但是每个 DataFrame 都有几列是唯一的)

Looping through and merging DataFrames with same index, same columns (however a few columns unique to each DataFrame)

所需任务的描述

我使用以下代码合并 dfdf1(显示的示例数据),它可以很好地满足我的需要。但是,我需要遍历大量数据帧(例如 df2,但会是 df3df4 等)并且我不确定如何修改代码。我有具有相同索引、相同列的 DataFrame,但是每个 DataFrame 都有几列是单独的。我使用下面的代码并且它运行良好,但我希望修改它以便我可以遍历 dfdf1,将它们合并在一起,创建 requireddata 但然后在 requireddatadf2 合并。同样的逻辑将继续 requireddatadf3 合并等等。任何帮助都是极好的!! :)

df

       ID    AA  TA  TL
Date                      
2001  AAPL   1.0  44  50 
2002  AAPL   3.0  33  51 
2003  AAPL   2.0  22  53 
2004  AAPL   5.0  11  76 
2005  AAPL   2.0  33  44 
2006  AAPL   3.0  22  12 

df1

       ID    AA  TA  ML
Date                      
2001  MSFT   3.5  44  12
2002  MSFT   6.7  33  15
2003  MSFT   2.3  22  19
2004  MSFT   5.5  11  20
2005  MSFT   2.2  33  43
2006  MSFT   3.2  22  23

df2 例子

       ID    AA  TA  PP
Date                      
2001  TSLA   3.3  48  18
2002  TSLA   6.3  38  18
2003  TSLA   2.6  28  18
2004  TSLA   5.3  18  28
2005  TSLA   2.3  38  48
2006  TSLA   3.3  28  28

使用代码

dfdates['Date'] # this has dates required for index
df
df1

cols_to_use = df.columns.difference(df1.columns) #compare column difference df and df1
cols_to_use1 = df1.columns.difference(df.columns) #compare column difference df1 and df

dataframe = pd.DataFrame(columns = cols_to_use, index = df['Date']) #dataframe with columns in df1 but not in df
dataframe1 = pd.DataFrame(columns = cols_to_use1, index = df1['Date']) #dataframe with columns in df but not in df1

datatesting = pd.concat([dataframe, df], axis=1) #merge missing columns into df
datatesting1 = pd.concat([dataframe1, df1], axis=1) #merge missing columns into df1

diff = datatesting1.columns.difference(datatesting.columns) #check difference (is 0)
print (diff)
frames = [datatesting, datatesting1] #list of dataframes 
requireddata = pd.concat(frames) #merge dataframes

创建这个:

       ID    AA   TA   TL  ML
Date                      
2001  AAPL   1.0  44  50  NaN
2002  AAPL   3.0  33  51  NaN
2003  AAPL   2.0  22  53  NaN
2004  AAPL   5.0  11  76  NaN
2005  AAPL   2.0  33  44  NaN
2006  AAPL   3.0  22  12  NaN                    
2001  MSFT   3.5  44  NaN  12
2002  MSFT   6.7  33  NaN  15
2003  MSFT   2.3  22  NaN  19
2004  MSFT   5.5  11  NaN  20
2005  MSFT   2.2  33  NaN  43
2006  MSFT   3.2  22  NaN  23

使用循环代码,喜欢这样的东西:

       ID    AA   TA   TL  ML  PP
Date                      
2001  AAPL   1.0  44  50  NaN  NaN
2002  AAPL   3.0  33  51  NaN  NaN
2003  AAPL   2.0  22  53  NaN  NaN
2004  AAPL   5.0  11  76  NaN  NaN
2005  AAPL   2.0  33  44  NaN  NaN
2006  AAPL   3.0  22  12  NaN  NaN                  
2001  MSFT   3.5  44  NaN  12  NaN
2002  MSFT   6.7  33  NaN  15  NaN
2003  MSFT   2.3  22  NaN  19  NaN
2004  MSFT   5.5  11  NaN  20  NaN
2005  MSFT   2.2  33  NaN  43  NaN
2006  MSFT   3.2  22  NaN  23  NaN
2001  TSLA   3.3  48  NaN  NaN  18
2002  TSLA   6.3  38  NaN  NaN  18
2003  TSLA   2.6  28  NaN  NaN  18
2004  TSLA   5.3  18  NaN  NaN  28
2005  TSLA   2.3  38  NaN  NaN  48
2006  TSLA   3.3  28  NaN  NaN  28

我认为这里不需要列差异,只使用 concat,列正确对齐:

df = pd.concat([df,df1,df2], sort=False)
print (df)
        ID   AA  TA    TL    ML    PP
Date                                 
2001  AAPL  1.0  44  50.0   NaN   NaN
2002  AAPL  3.0  33  51.0   NaN   NaN
2003  AAPL  2.0  22  53.0   NaN   NaN
2004  AAPL  5.0  11  76.0   NaN   NaN
2005  AAPL  2.0  33  44.0   NaN   NaN
2006  AAPL  3.0  22  12.0   NaN   NaN
2001  MSFT  3.5  44   NaN  12.0   NaN
2002  MSFT  6.7  33   NaN  15.0   NaN
2003  MSFT  2.3  22   NaN  19.0   NaN
2004  MSFT  5.5  11   NaN  20.0   NaN
2005  MSFT  2.2  33   NaN  43.0   NaN
2006  MSFT  3.2  22   NaN  23.0   NaN
2001  TSLA  3.3  48   NaN   NaN  18.0
2002  TSLA  6.3  38   NaN   NaN  18.0
2003  TSLA  2.6  28   NaN   NaN  18.0
2004  TSLA  5.3  18   NaN   NaN  28.0
2005  TSLA  2.3  38   NaN   NaN  48.0
2006  TSLA  3.3  28   NaN   NaN  28.0