Python: les pandas de fusionner plusieurs dataframes
J'ai diferent dataframes et la nécessité de les fusionner, basé sur la colonne date. Si seulement j'avais deux dataframes, je pourrais utiliser df1.merge(df2, on='date')
, de le faire avec trois dataframes, j'utilise df1.merge(df2.merge(df3, on='date'), on='date')
, cependant, il devient vraiment très complexe et illisible pour le faire avec plusieurs dataframes.
Tous dataframes ont une colonne en commun -date
, mais ils n'ont pas le même nombre de lignes ou de colonnes et je n'ai plus besoin de ces lignes dans lequel chaque jour est commune à toutes les dataframe.
Donc, je suis en train d'écrire une récursivité fonction qui retourne un dataframe avec toutes les données, mais il ne fonctionne pas. Comment dois-je les fusionner plusieurs dataframes alors?
J'ai essayé de différentes façons et eu des erreurs comme out of range
, keyerror 0/1/2/3
et can not merge DataFrame with instance of type <class 'NoneType'>
.
C'est le script que j'ai écrit:
dfs = [df1, df2, df3] # list of dataframes
def mergefiles(dfs, countfiles, i=0):
if i == (countfiles - 2): # it gets to the second to last and merges it with the last
return
dfm = dfs[i].merge(mergefiles(dfs[i+1], countfiles, i=i+1), on='date')
return dfm
print(mergefiles(dfs, len(dfs)))
Un exemple:
df_1:
May 19, 2017;1,200.00;0.1%
May 18, 2017;1,100.00;0.1%
May 17, 2017;1,000.00;0.1%
May 15, 2017;1,901.00;0.1%
df_2:
May 20, 2017;2,200.00;1000000;0.2%
May 18, 2017;2,100.00;1590000;0.2%
May 16, 2017;2,000.00;1230000;0.2%
May 15, 2017;2,902.00;1000000;0.2%
df_3:
May 21, 2017;3,200.00;2000000;0.3%
May 17, 2017;3,100.00;2590000;0.3%
May 16, 2017;3,000.00;2230000;0.3%
May 15, 2017;3,903.00;2000000;0.3%
Attendue du résultat de la fusion:
May 15, 2017; 1,901.00;0.1%; 2,902.00;1000000;0.2%; 3,903.00;2000000;0.3%
- Double Possible de les pandas de trois façon de rejoindre plusieurs dataframes sur les colonnes
Vous devez vous connecter pour publier un commentaire.
Ci-dessous, est la plus propre, de manière compréhensible de la fusion de plusieurs dataframe si des requêtes complexes ne sont pas impliqués.
Simplement fusionner avec DATE comme l'index et de fusion à l'aide de EXTÉRIEUR méthode (pour obtenir toutes les données).
Donc, en gros, de charger tous les fichiers que vous avez comme trame de données. Puis de fusionner des fichiers à l'aide
merge
oureduce
fonction.vous pouvez ajouter autant de données d'images dans le code ci-dessus. C'est la bonne partie de cette méthode. Pas de requêtes complexes impliqués.
De conserver les valeurs qui appartiennent à la même date que vous avez besoin de fusionner sur le
DATE
Puis écrire la fusion de données dans le fichier csv si vous le souhaitez.
Cela devrait vous donner
DATE VALUE1 VALUE2 VALUE3 ....
Ressemble les données ont les mêmes colonnes, de sorte que vous pouvez:
functools.réduire et pd.concat sont de bonnes solutions, mais en terme de temps d'exécution de la mp.concat est le meilleur.
Il y a 2 solutions pour ceci, mais il retourner toutes les colonnes séparément:
@dannyeuu réponse est bonne. pd.concat n'est naturellement une jointure sur les colonnes d'index, si vous définissez l'axe 1 à l'option. La valeur par défaut est une jointure externe, mais vous pouvez spécifier inner join trop. Voici un exemple:
Si vous êtes le filtrage par date ce sera le retourner:
set(df1.loc[:, 0].intersection(set(df3.loc[:, 0]).intersection(set(df2.loc[:, 0])).intersection(set(df1.loc[:, 0])))
?Regardez cette les pandas de trois façon de rejoindre plusieurs dataframes sur les colonnes
Merci pour votre aide @jezrael, @zipa et @everestial007, les deux réponses sont ce dont j'ai besoin. Si je voulais faire un appel récursif, ce serait également fonctionner comme prévu: