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!
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
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
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:
set_index
, lorsque la colonne index
(la première colonne) est mélangée, l'ordre des autres colonnes est conservé intactreindex
, 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