J'ai 3 fichiers CSV. Chacun a la première colonne en tant que noms (chaîne) des personnes, tandis que toutes les autres colonnes de chaque dataframe sont des attributs de cette personne.
Comment puis-je «joindre» les trois documents CSV pour créer un seul CSV avec chaque ligne ayant tous les attributs pour chaque valeur unique du nom de chaîne de la personne?
La join()
fonction dans pandas spécifie que j'ai besoin d'un multiindex, mais je ne sais pas ce qu'un schéma d'indexation hiérarchique a à voir avec la création d'une jointure basée sur un seul index.
df1.join([df2, df3], on=[df2_col1, df3_col1])
n'a pas fonctionné.Réponses:
Importations présumées:
La réponse de John Galt est essentiellement une
reduce
opération. Si j'ai plus d'une poignée de dataframes, je les mettrais dans une liste comme celle-ci (générée via des compréhensions de listes ou des boucles ou autres):En supposant qu'ils aient une colonne commune, comme
name
dans votre exemple, je ferais ce qui suit:De cette façon, votre code doit fonctionner avec le nombre de dataframes que vous souhaitez fusionner.
Edit 1er août 2016 : Pour ceux qui utilisent Python 3:
reduce
a été déplacé versfunctools
. Donc, pour utiliser cette fonction, vous devez d'abord importer ce module:la source
reduce
été remplacé parfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
etname3
respectivement.n-1
appels à la fonction de fusion? Je suppose que dans ce cas où le nombre de dataframes est petit, cela n'a pas d'importance, mais je me demande s'il existe une solution plus évolutive.df
index multi-colonnes (il injectait le `` on '' en tant que colonne qui fonctionnait pour la première fusion, mais les fusions suivantes ont échoué), au lieu de cela, je l'ai fait fonctionner avec:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Vous pouvez essayer ceci si vous avez 3 dataframes
alternativement, comme mentionné par cwharland
la source
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
etname3
respectivementdf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
C'est une situation idéale pour la
join
méthodeLa
join
méthode est conçue exactement pour ces types de situations. Vous pouvez joindre n'importe quel nombre de DataFrames avec lui. Le DataFrame appelant se joint à l'index de la collection de DataFrames passées. Pour travailler avec plusieurs DataFrames, vous devez placer les colonnes de jointure dans l'index.Le code ressemblerait à ceci:
Avec les données de @ zero, vous pouvez faire ceci:
la source
pd.DataFrame().join(dfs, how="outer")
. Cela peut être plus propre dans certaines situations.pd.concat
se traduira par une syntaxe plus simple:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
est également plus polyvalent lorsqu'il s'agit de gérer des noms de colonnes en double dans plusieurs fichiers dfs (cejoin
n'est pas aussi bon pour cela) bien que vous ne puissiez effectuer que des jointures internes ou externes avec lui.dfs[0].join(dfs[1:])
devrait être éditédfs[0].join(dfs[1:], sort=False)
car sinon unFutureWarning
apparaîtra. Merci pour le bel exemple.ValueError: Indexes have overlapping values
J'obtiens une erreur en essayant cela: bien que, en inspectant les dataframes individuels dans la liste, ils ne semblent pas avoir de valeurs qui se chevauchent.Cela peut également être fait comme suit pour une liste de dataframes
df_list
:ou si les dataframes sont dans un objet générateur (par exemple pour réduire la consommation de mémoire):
la source
Dans
python
3.6.3 avecpandas
0.22.0, vous pouvez également utiliserconcat
tant que vous définissez comme index les colonnes que vous souhaitez utiliser pour la jointureoù
df1
,df2
etdf3
sont définis comme dans la réponse de John Galtla source
On n'a pas besoin d'un multiindex pour effectuer des opérations de jointure . Il suffit de définir correctement la colonne d'index sur laquelle effectuer les opérations de jointure (quelle commande
df.set_index('Name')
par exemple)L'
join
opération est effectuée par défaut sur l'index. Dans votre cas, il vous suffit de préciser que laName
colonne correspond à votre index. Ci-dessous un exempleUn tutoriel peut être utile.
la source
Voici une méthode pour fusionner un dictionnaire de trames de données tout en gardant les noms de colonne synchronisés avec le dictionnaire. En outre, il remplit les valeurs manquantes si nécessaire:
Ceci est la fonction pour fusionner un dict de trames de données
OK, permet de générer des données et de tester ceci:
la source
Solution simple:
Si les noms de colonnes sont similaires:
Si les noms de colonnes sont différents:
la source
Il y a une autre solution de la documentation pandas (que je ne vois pas ici),
en utilisant le
.append
Le
ignore_index=True
est utilisé pour ignorer l'index du dataframe ajouté, en le remplaçant par le prochain index disponible dans l'index source.S'il existe différents noms de colonne,
Nan
sera introduit.la source
Les trois dataframes sont
Fusionnons ces cadres en utilisant pd.merge imbriqué
Ici nous allons, nous avons notre dataframe fusionné.
Bonne analyse !!!
la source