1
votes

Fusion de DF de deux listes différentes en python

Il y a deux listes où les éléments sont des DF et ont datetimeindex:

def df_merge(df1 ,df1):
    p_q_df1 = pd.merge(df1,df1,  on='Dates') 
    return p_q_df1        

#this merged df has now price and quantity representing df1 from list! and list_2

Je le fais avec un par un en utilisant la fonction de fusion pandas. J'ai essayé de faire quelque chose où j'ajoute la liste des deux et fais fonctionner comme ceci:

lst_1 = [ df1, df2, df3, df4]   #columns are same here 'price' 

lst_2 = [df1, df2, df3, df4]    #columns are same here 'quantity'

je dois toujours appliquer à nouveau à chaque paire. Existe-t-il un meilleur moyen, peut-être en boucle, d'automatiser cela?


1 commentaires

Quel type de fusion essayez-vous d'appliquer? Peut-être que pd.concat peut vous aider?


3 Réponses :


1
votes

IIUC,

vous pouvez concaténer vos df puis fusionner

from functools import reduce
lst_1 = [ df1, df2, df3, df4] 

df_merged = reduce(lambda  left,right: pd.merge(left,right,on=['Dates'],
                                            how='outer'), lst_1)

Je suppose que vos dataframes sont de la même forme afin qu'ils puissent être concaténés.

si vous souhaitez fusionner plusieurs dataframes dans votre liste, vous pouvez utiliser la fonction de réduction de la lib python standard en utilisant une fusion externe pour obtenir toutes les lignes possibles.

dfs_1 = pd.concat(lst_1)
dfs_2 = pd.concat(lst_2)
pd.merge(dfs_1,dfs_2,on='Dates',how='outer') 
# change how to specify the behavior of the merge.


4 commentaires

C'est une bien meilleure méthode que ma réponse


@Datanovice merci pour votre réponse. Mais que faire si je veux une sortie comme celle-ci: df_online qui est la fusion de df1 de lst1 et de df de lst2. je veux comme ça 4 DF


Merci @ArpitGothwal Je pense que vous vouliez cocher la réponse de M. Parfait.


@ArpitGothwal alors un vote positif est tout à fait acceptable, mais vous devriez cocher en vert la solution qui a résolu votre problème! bonne chance mon ami



0
votes
lst_1 = [ df1, df2, df3, df4]   #columns are same here 'price' 

lst_2 = [df1, df2, df3, df4]    #columns are same here 'quantity'

def merge(lst_1, lst_2):
   df = pd.DataFrame()
   for _df in lst_1:
      df = df.merge(_df, on='Dates')

   for _df in lst_2:
      df = df.merge(_df, on='Dates')

1 commentaires

Vous ne devez jamais appeler merge , append , concat ou d'autres opérations de grands blocs de données dans une boucle. Cela peut entraîner une copie quadractique



2
votes

Envisagez une boucle élémentaire avec zip qui peut être gérée dans une compréhension de liste.

# DATES AS INDEX
final_lst = [pd.concat(i, j, axis=1) for i, j in zip(lst_1, lst_2)]

# DATES AS COLUMN
final_lst = [pd.merge(i, j, on='Dates') for i, j in zip(lst_1, lst_2)]


2 commentaires

Merci cela a parfaitement fonctionné. Sorti la sortie souhaitée


Génial! Heureux de vous aider.