Pandas объединяет список DFS на основе значения столбца группировки

#python #pandas #numpy #dataframe

#python #pandas #numpy #фрейм данных

Вопрос:

У меня есть список DFS Pandas, каждый из которых имеет одинаковый columns :

 df1_values = [["2001-01-01","Lime",10],["2001-01-02","Lime",20]]
df2_values = [["2001-01-01","Mango",40],["2001-01-02","Mango",50],["2001-01-03","Mango",60]]
df3_values = [["2001-01-01","Orange",30]]
df1 = pd.DataFrame(df1_values,columns=["date","fruit","value"])
df2 = pd.DataFrame(df2_values,columns=["date","fruit","value"])
df3 = pd.DataFrame(df3_values,columns=["date","fruit","value"])
dfs = [df1,df2,df3]
  

один из примеров DFS -> DF1:

       date     fruit    value
0   2001-01-01  Lime    10
1   2001-01-02  Lime    20
  

Попытка merge всех DFS list в приведенном ниже формате (сгруппированных по дате), ОЖИДАЕМАЯ ОПЕРАЦИЯ:

     date         fruit  value
  2001-01-01     Lime    10
  2001-01-01     Mango   40
  2001-01-01     Orange  30
  2001-01-02     Lime    20
  2001-01-02     Mango   50
  2001-01-03     Mango   60
  

Текущий итеративный подход:

 date_dict={}
for each_date in ["2001-01-01","2001-01-02","2001-01-03"]:
   for each_df in dfs:
       if each_date in date_dict:
        #append the values for this date
       else:
           #enter the values for this date
  

Это работает, но занимает много времени.

Подход Pandas:

 from functools import reduce
df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['fruit'],
                                        how='outer'), dfs)
  

OP:

      date_x    fruit    value_x date_y     value_y  date    value
0   2001-01-01  Lime    10.0    NaN         NaN     NaN     NaN
1   2001-01-02  Lime    20.0    NaN         NaN     NaN     NaN
2   NaN         Mango   NaN    2001-01-01   40.0    NaN     NaN
3   NaN         Mango   NaN    2001-01-02   50.0    NaN     NaN
4   NaN         Mango   NaN    2001-01-03   60.0    NaN     NaN
5   NaN         Orange  NaN     NaN         NaN  2001-01-01 30.0
  

Любые предложения о том, как исправить ошибки, могут быть полезны.

Ответ №1:

Вы можете выполнить pandas.concat следующее .sort_values :

 print( pd.concat(dfs).sort_values('date') )
  

С принтами:

          date   fruit  value
0  2001-01-01    Lime     10
0  2001-01-01   Mango     40
0  2001-01-01  Orange     30
1  2001-01-02    Lime     20
1  2001-01-02   Mango     50
2  2001-01-03   Mango     60