187 votes

Comment conserver l'index lors de l'utilisation de pandas merge ?

Je voudrais fusionner deux DataFrames et conserve l'index de la première image comme index dans l'ensemble de données fusionné. Cependant, lorsque j'effectue la fusion, le DataFrame résultant a un indice entier. Comment puis-je spécifier que je veux conserver l'index du cadre de données de gauche ?

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
                          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
                          'to_merge_on': {0: 1, 1: 3, 2: 5}})

In [6]: a
Out[6]:
   col1  to_merge_on
a     1            1
b     2            3
c     3            4

In [7]: b
Out[7]:
   col2  to_merge_on
0     1            1
1     2            3
2     3            5

In [8]: a.merge(b, how='left')
Out[8]:
   col1  to_merge_on  col2
0     1            1   1.0
1     2            3   2.0
2     3            4   NaN

In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')

EDIT : Passage à un code d'exemple qui peut être facilement reproduit

235voto

Wouter Overmeire Points 6676
In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
       col1  to_merge_on  col2
index
a         1            1     1
b         2            3     2
c         3            4   NaN

Notez que pour certaines opérations de fusion à gauche, vous pouvez vous retrouver avec plus de lignes qu'en a lorsqu'il existe des correspondances multiples entre a y b . Dans ce cas, vous devrez peut-être supprimer les doublons .

16voto

Matthew Son Points 73

Vous pouvez faire une copie de l'index sur le cadre de données de gauche et faire la fusion.

a['copy_index'] = a.index
a.merge(b, how='left')

J'ai trouvé cette méthode simple très utile lorsque je travaillais avec de grands cadres de données et que j'utilisais pd.merge_asof() (o dd.merge_asof() ).

Cette approche serait supérieure lorsque la réinitialisation de l'index est coûteuse (grand cadre de données).

10voto

John Galt Points 1144

Il existe une solution non-dd.merge utilisant Series.map y DataFrame.set_index .

In: a['col2'] = a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
In: a['col2']
Out:
   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

Cela n'introduit pas un mannequin index nom pour l'index.

Notez cependant qu'il n'y a pas de DataFrame.map et cette approche n'est donc pas adaptée aux colonnes multiples.

8voto

Supratik Majumdar Points 1035
df1 = df1.merge(df2, how="inner", left_index=True, right_index=True)

Cela permet de préserver l'indice de df1

2voto

lisrael1 Points 28

Une autre option simple consiste à renommer l'index à ce qu'il était auparavant :

a.merge(b, how="left").set_axis(a.index)

merge préserve l'ordre du cadre de données 'a', mais réinitialise simplement l'index, ce qui permet d'utiliser set_axis en toute sécurité.

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