J'ai un df avec

col0 col1 col2 col3
a    1    2    text1
b    1    2    text2
c    1    3    text3

Et moi un autre fichier texte avec

col0 col1 col2
met1 a    text1
met2 b    text2
met3 c    text3

Comment faire correspondre les valeurs de ligne de col3 dans mon premier df au fichier texte col2 et ajouter au df précédent uniquement la chaîne col0 sans changer la structure du df

Sortie désirée:

col0 col1 col2 col3  col4
a    1    2    text1 met1
b    1    2    text2 met2
c    1    3    text3 met3
1
novicebioinforesearcher 21 avril 2017 à 00:01

3 réponses

Meilleure réponse
print(df)
  col0  col1  col2   col3
0    a     1     2  text1
1    b     1     2  text2
2    c     1     3  text3

print(df2)
   col0 col1   col2
0  met1    a  text1
1  met2    b  text2
2  met3    c  text3

Fusionner df et df2

df3 = df.merge(df2, left_on='col3', right_on='col2',suffixes=('','_1'))

Entretien ménager ... renommer les colonnes, etc.

df3 = df3.rename(columns={'col0_1':'col4'}).drop(['col1_1','col2_1'], axis=1)

print(df3)

  col0  col1  col2   col3  col4
0    a     1     2  text1  met1
1    b     1     2  text2  met2
2    c     1     3  text3  met3

Et, réaffectez à df si vous le souhaitez.

df = df3

OU

df = df.assign(col4=df.merge(df2, left_on='col3', right_on='col2',suffixes=('','_1'))['col0_1'])

print(df)
  col0  col1  col2   col3  col4
0    a     1     2  text1  met1
1    b     1     2  text2  met2
2    c     1     3  text3  met3
1
Scott Boston 20 avril 2017 à 21:31

Appelez votre df df1. Ensuite, chargez d'abord le fichier texte dans un dataframe en utilisant df2 = pd.read_csv('filename.txt'). Maintenant, vous voulez renommer les colonnes dans df2 afin que la colonne sur laquelle vous souhaitez fusionner ait le même nom dans les deux colonnes:

df2.columns = ['new_col1', 'new_col2', 'col3']

Alors:

pd.merge(df1, df2, on='col3')
1
splinter 20 avril 2017 à 21:14

Vous pouvez utiliser pandas.dataframe.merge(). Par exemple.:

df.merge(df2.loc[:, ['col0', 'col2']], left_on='col3', right_on='col2')
2
THN 20 avril 2017 à 21:16