J'essaie de réindexer un objet DataFrame
de pandas, comme tel,
From:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
To :
b c
1 2 3
10 11 12
20 21 22
Je vais à ce sujet comme indiqué ci-dessous et je reçois la mauvaise réponse. Des indices sur comment faire cela?
>>> col = ['a','b','c']
>>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
>>> data
a b c
0 1 2 3
1 10 11 12
2 20 21 22
>>> idx2 = data.a.values
>>> idx2
array([ 1, 10, 20], dtype=int64)
>>> data2 = DataFrame(data,index=idx2,columns=col[1:])
>>> data2
b c
1 11 12
10 NaN NaN
20 NaN NaN
Une idée pourquoi cela se passe?
Pourquoi n'utilisez-vous pas simplement la méthode set_index
?
In : col = ['a','b','c']
In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
In : data
Out:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
In : data2 = data.set_index('a')
In : data2
Out:
b c
a
1 2 3
10 11 12
20 21 22
Si vous ne voulez pas "a" dans l'index
Dans :
col = ['a','b','c']
data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
data
En dehors:
a b c
0 1 2 3
1 10 11 12
2 20 21 22
Dans :
data2 = data.set_index('a')
En dehors:
b c
a
1 2 3
10 11 12
20 21 22
Dans :
data2.index.name = None
En dehors:
b c
1 2 3
10 11 12
20 21 22
Si vous souhaitez définir l'index sans perdre la colonne, utilisez set_index
avec drop=False
:
data.set_index('a', drop=False)
a b c
a
1 1 2 3
10 10 11 12
20 20 21 22
Une autre option consiste à définir directement l'attribut index
, ce qui est utile pour les applications critiques en termes de performances:
data.index = data['a']
data
a b c
a
1 1 2 3
10 10 11 12
20 20 21 22
Ou, si "a" doit apparaître, utilisez
data.index = data.pop('a')
data
b c
a
1 2 3
10 11 12
20 21 22
pop
et l'affectation à index
sont des opérations sur place, par opposition à set_index
qui renvoie une copie des données. Voici quelques timings:
df_ = data.copy()
df = pd.concat([df_] * 10000, ignore_index=True)
%timeit df.set_index('a', drop=False)
%timeit df.index = df['a']
784 µs ± 68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
132 µs ± 2.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Remarque
Ne vous laissez pas berner par le paramètreinplace=True
. Cela crée simplement une copie des données et les assigne à l'original variable.inplace=True
etinplace=False
toujours génèrent un copie.
Pour référence, pour définir l'index sur un nombre croissant croissant de manière monotone, vous pouvez définir efficacement l'index sur tout objet de plage.
df.index = pd.RangeIndex(len(df))
df.index = range(len(df))
df.index = np.arange(len(df))
df.index
peut être affecté à n’importe quelle séquence semblable à une liste, à condition que la séquence ait la même longueur que df
.