web-dev-qa-db-fra.com

Python Pandas ne fusionne que certaines colonnes

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 la totalité du DataFrame.

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.

74
joelotz

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')])
64
Andy Hayden

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

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

Cela vous donnera tout ce qui se trouve dans le fichier original df + ajoutez la colonne correspondante dans df2 que vous souhaitez rejoindre.

61
Arthur D. Howland

Vous pouvez utiliser .loc pour sélectionner les colonnes spécifiques avec toutes les lignes, puis tirez cela. 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é .iloc qui vous permet de spécifier les lignes et les colonnes souhaitées dans un format numérique. En utilisant :, votre sélection de toutes les lignes, mais [0:5] sélectionne les 5 premières colonnes. Vous pouvez utiliser .loc à spécifier par nom, mais si vous traitez avec des noms de colonne longs, alors .iloc peut-être mieux.

8
Terrance DeJesus

Cela consiste à fusionner les colonnes sélectionnées à partir de deux tables.

Si table_1 contient t1_a,t1_b,t1_c..,id,..t1_z colonnes et table_2 contient t2_a, t2_b, t2_c..., id,..t2_z colonnes, et seulement t1_a, id, t2_a sont requis dans la table finale, puis

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)
6
Marco167

J'ai la même situation, j'essaie de construire une fusion semblable à la requête suivante

select
 rio.calculation_type,
 rio.asin, rio.country, rio.channel,
 rio.date, rio.running_inbound, 
 rio.running_outbound, 
 rio.inbound, 
 rio.outbound,
 ro.outbound as ro_outbound,
 min(ro.date) as date_out 
from
 running_inbound_and_outbound rio 
 left join running_outbound ro 
  on ro.running_outbound >= rio.running_inbound 
  and ro.country = rio.country 
  and ro.channel = rio.channel 
  and ro.asin = rio.asin 
  and ro.calculation_type = rio.calculation_type
 group by
  1, 2, 3, 4,5,6,7,8,9
0
Saket Dabi