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.

Guppys à bulles
la source
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')])
Andy Hayden
la source
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.

Arthur D. Howland
la source
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.

tonne de cash
la source
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.

Terrance DeJesus
la source
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)
Marco167
la source