Les pandas Python ne fusionnent que certaines colonnes


109

Est-il possible de ne fusionner que certaines colonnes? J'ai un DataFrame df1 avec les colonnes x, y, z et df2 avec les colonnes x, a, b, c, d, e, f, etc.

Je veux fusionner les deux DataFrames sur x, mais je veux seulement fusionner les colonnes df2.a, df2.b - pas le DataFrame entier.

Le résultat serait un DataFrame avec x, y, z, a, b.

Je pourrais fusionner puis supprimer les colonnes indésirables, mais il semble qu'il existe une meilleure méthode.


1
Andy: Sainte vache c'était facile ... J'ai besoin d'une pause, je rends évidemment ça trop compliqué. Merci pour la clarté!
BubbleGuppies

Réponses:


81

Vous pouvez fusionner le sous-DataFrame (avec seulement ces colonnes):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])

6
Hmmm, je me demande s'il devrait y avoir un moyen natif de faire cela, comme un sous-ensemble dans dropna ... rassemblera le numéro de github
Andy Hayden

Hmmm ... J'ai essayé de l'utiliser pour fusionner la colonne 'Unique_External_Users' de df2 à df1 mais j'ai obtenu une erreur ... "Aucun de [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] sont dans les [colonnes] ".
CoolDocMan

Voici le code. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan Je pense que vous avez manqué quelque chose dans la réponse proposée: list('xab')prend chaque élément (lettre) de la chaîne «xab» et le convertit en un élément de liste donc list('xab')retourne ['x', 'a', 'b']. Cela fonctionne si chaque colonne a une seule lettre comme nom. Dans votre cas, je pense que vous devez faire df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Vous avez probablement déjà résolu le problème maintenant, en laissant cela aux débutants, comme moi
SOf_PUAR

114

Vous voulez utiliser DEUX crochets, donc si vous effectuez une sorte d'action RECHERCHEV:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Cela vous donnera tout dans le df d'origine + ajoutez cette colonne correspondante dans df2 que vous souhaitez rejoindre.


11

Si vous souhaitez supprimer des colonnes du bloc de données cible, mais que les colonnes sont requises pour la jointure, vous pouvez effectuer les opérations suivantes:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

La .drop('key1')partie empêchera «key1» d'être conservé dans la trame de données résultante, bien qu'il soit nécessaire de se joindre en premier lieu.


4
J'obtiens l'erreur suivante si j'essaye ceci:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
try .drop (columns = ['key1'])
psangam

Ou .drop ('key1', axis = 1)
tonneofash

8

Vous pouvez utiliser .locpour sélectionner les colonnes spécifiques avec toutes les lignes, puis les extraire. Un exemple est ci-dessous:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

Dans cet exemple, vous fusionnez dataframe1 et dataframe2. Vous avez choisi de faire une jointure externe gauche sur «clé». Cependant, pour dataframe2, vous avez spécifié .ilocce qui vous permet de spécifier les lignes et colonnes souhaitées dans un format numérique. En utilisant :, vous sélectionnez toutes les lignes, mais [0:5]sélectionne les 5 premières colonnes. Vous pouvez utiliser .locpour spécifier par nom, mais si vous traitez avec de longs noms de colonnes, cela .ilocpeut être mieux.


1
Attention ça .locva faire une copie , et sur un gros df ça peut être douloureux. Il peut être préférable de fusionner puis de prendre immédiatement une tranche de colonne dans la même expression.
smci

7

Il s'agit de fusionner les colonnes sélectionnées de deux tables.

Si table_1contient des t1_a,t1_b,t1_c..,id,..t1_zcolonnes et table_2contient des t2_a, t2_b, t2_c..., id,..t2_zcolonnes, et que seuls t1_a, id, t2_a sont requis dans la table finale, alors

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.