web-dev-qa-db-fra.com

Différence entre les méthodes df.reindex () et df.set_index () dans pandas

Cela m'a dérouté, ce qui est très simple mais je n'ai pas immédiatement trouvé la réponse sur StackOverflow:

  • df.set_index('xcol') fait de la colonne 'xcol' devenir l'index (quand c'est une colonne de df).

  • df.reindex(myList), cependant, prend des index de l'extérieur du dataframe, par exemple, à partir d'une liste nommée myList que nous avons définie ailleurs.

J'espère que ce post le clarifie! Les ajouts à ce message sont également les bienvenus!

11

Vous pouvez voir la différence sur un exemple simple. Considérons cette trame de données:

df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)
   a  b
0  1  3
1  2  4

Les index sont alors 0 et 1

Si vous utilisez set_index Avec la colonne 'a' alors les index sont 1 et 2. Si vous faites df.set_index('a').loc[1,'b'], vous obtiendrez 3.

Maintenant, si vous souhaitez utiliser reindex avec les mêmes index 1 et 2 tels que df.reindex([1,2]), vous obtiendrez 4.0 lorsque vous ferez df.reindex([1,2]).loc[1,'b']

Ce qui s'est passé, c'est que set_index A remplacé les index précédents (0,1) par (1,2) (valeurs de la colonne 'a') sans toucher à l'ordre des valeurs dans la colonne 'b'

df.set_index('a')
   b
a   
1  3
2  4

tandis que reindex modifie les index mais conserve les valeurs de la colonne 'b' associées aux index dans le df d'origine

df.reindex(df.a.values).drop('a',1) # equivalent to df.reindex(df.a.values).drop('a',1)
     b
1  4.0
2  NaN
# drop('a',1) is just to not care about column a in my example

Enfin, reindex change l'ordre des index sans changer les valeurs de la ligne associée à chaque index, tandis que set_index Va changer les index avec les valeurs d'une colonne, sans toucher l'ordre de l'autre valeurs dans la trame de données

14
Ben.T

Juste pour ajouter, l'annulation de set_index serait reset_index méthode (plus ou moins):

df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
print (df)

df.set_index('a', inplace=True)
print(df)

df.reset_index(inplace=True, drop=False)
print(df)

   a  b
0  1  3
1  2  4
   b
a   
1  3
2  4
   a  b
0  1  3
1  2  4
3
prosti

Outre une excellente réponse de Ben. T, je voudrais donner un autre exemple de la façon dont ils sont différents lorsque vous utilisez reindex et set_index vers une colonne d'index

import pandas as pd
import numpy as np
testdf = pd.DataFrame({'a': [1, 3, 2],'b': [3, 5, 4],'c': [5, 7, 6]})

print(testdf)
print(testdf.set_index(np.random.permutation(testdf.index)))
print(testdf.reindex(np.random.permutation(testdf.index)))

Production:

  • Avec set_index, lorsque la colonne index (la première colonne) est mélangée, l'ordre des autres colonnes est conservé intact
  • Avec reindex, l'ordre des lignes est modifié en conséquence au shuffle de la colonne index.
   a  b  c
0  1  3  5
1  3  5  7
2  2  4  6
   a  b  c
1  1  3  5
2  3  5  7
0  2  4  6
   a  b  c
2  2  4  6
1  3  5  7
0  1  3  5
2
Long