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?
3 Réponses :
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.
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
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')
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
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)]
Merci cela a parfaitement fonctionné. Sorti la sortie souhaitée
Génial! Heureux de vous aider.
Quel type de fusion essayez-vous d'appliquer? Peut-être que
pd.concat
peut vous aider?