Цикл и объединение DataFrames с одинаковым индексом, одинаковыми столбцами (однако несколько столбцов уникальны для каждого DataFrame) - PullRequest
1 голос
/ 26 января 2020

Описание требуемой задачи

Я использую следующий код для объединения df и df1 (показаны примеры данных), и он хорошо работает для того, что мне нужно. Однако мне нужно l oop на большом количестве фреймов данных (например, df2, но будет df3, df4 et c.) И я не уверен, как изменить код. У меня есть DataFrames с тем же индексом, те же столбцы, однако несколько столбцов являются индивидуальными для каждого DataFrame. Я использую следующий код, и он хорошо работает, но я могу sh изменить его, чтобы я мог с oop по df и df1, объединить их вместе, создав requireddata, но затем повторить это, где requireddata объединено с df2. Тот же лог c будет продолжаться с requireddata слиянием с df3 и так далее. Любая помощь будет потрясающей! :)

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

1 Ответ

1 голос
/ 26 января 2020

Я считаю, что разница в столбцах здесь не нужна, используйте только 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...