5 votes

Dans pandas, comment concaténer horizontalement puis supprimer les colonnes redondantes ?

Disons que j'ai deux cadres de données.

DF1 : col1, col2, col3,

DF2 : col2, col4, col5

Comment concaténer les deux cadres de données horizontalement et obtenir les colonnes 1, 2, 3, 4 et 5 ? Pour l'instant, je fais pd.concat([DF1, DF2], axis = 1) mais je me retrouve avec deux col2. En supposant que toutes les valeurs à l'intérieur des deux col2 sont les mêmes, je veux avoir une seule colonne.

5voto

Allen Points 8723

La suppression des doublons devrait fonctionner. Comme drop_duplicates ne fonctionne qu'avec l'index, nous devons transposer le DF pour supprimer les doublons et le transposer à nouveau.

pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T

4voto

jezrael Points 290608

Utilisation difference pour les colonnes de DF2 qui ne sont pas dans DF1 et les sélectionner simplement par [] :

DF1 = pd.DataFrame(columns=['col1', 'col2', 'col3'])
DF2 = pd.DataFrame(columns=['col2', 'col4', 'col5'])

DF2 = DF2[DF2.columns.difference(DF1.columns)]
print (DF2)
Empty DataFrame
Columns: [col4, col5]
Index: []

print (pd.concat([DF1, DF2], axis = 1))
Empty DataFrame
Columns: [col1, col2, col3, col4, col5]
Index: []

Horaires :

np.random.seed(123)

N = 1000
DF1 = pd.DataFrame(np.random.rand(N,3), columns=['col1', 'col2', 'col3'])
DF2 = pd.DataFrame(np.random.rand(N,3), columns=['col2', 'col4', 'col5'])

DF2['col2'] = DF1['col2']

In [408]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
10 loops, best of 3: 122 ms per loop

In [409]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
1000 loops, best of 3: 979 µs per loop

N = 10000:
In [411]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
1 loop, best of 3: 1.4 s per loop

In [412]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
1000 loops, best of 3: 1.12 ms per loop

0voto

W-B Points 94428
DF2.drop(DF2.columns[DF2.columns.isin(DF1.columns)],axis=1,inplace=True)

Ensuite,

pd.concat([DF1, DF2], axis = 1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X