Risposte:
o:
df['index1'] = df.index
oppure .reset_index
:
df.reset_index(level=0, inplace=True)
quindi, se hai un frame multiindice con 3 livelli di indice, come:
>>> df
val
tick tag obs
2016-02-26 C 2 0.0139
2016-02-27 A 2 0.5577
2016-02-28 C 6 0.0303
e vuoi convertire i livelli 1st ( tick
) e 3rd ( obs
) nell'indice in colonne, dovresti fare:
>>> df.reset_index(level=['tick', 'obs'])
tick obs val
tag
C 2016-02-26 2 0.0139
A 2016-02-27 2 0.5577
C 2016-02-28 6 0.0303
df.reset_index(level=df.index.names, inplace=True)
uno puoi convertire un dato multiindice intero in colonne
df.reset_index()
, che sposta l'intero indice nelle colonne (una colonna per livello) e crea un indice int da 0 a len (df) -1
df['index1'] = df.index
Restituisce un avviso: "Un valore sta tentando di essere impostato su una copia di una porzione da un DataFrame." Utilizzare invece la funzione df.assign (), come mostrato di seguito.
Per fornire un po 'più di chiarezza, diamo un'occhiata a un DataFrame con due livelli nel suo indice (un MultiIndex).
index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'],
['North', 'South']],
names=['State', 'Direction'])
df = pd.DataFrame(index=index,
data=np.random.randint(0, 10, (6,4)),
columns=list('abcd'))
Il reset_index
metodo, chiamato con i parametri predefiniti, converte tutti i livelli di indice in colonne e utilizza un RangeIndex
indice semplice come nuovo.
df.reset_index()
Utilizzare il level
parametro per controllare quali livelli di indice vengono convertiti in colonne. Se possibile, utilizzare il nome del livello, che è più esplicito. Se non ci sono nomi di livello, puoi fare riferimento a ciascun livello in base alla sua posizione intera, che inizia da 0 dall'esterno. È possibile utilizzare un valore scalare qui o un elenco di tutti gli indici che si desidera ripristinare.
df.reset_index(level='State') # same as df.reset_index(level=0)
Nel raro caso in cui si desideri conservare l'indice e trasformarlo in una colonna, è possibile effettuare le seguenti operazioni:
# for a single level
df.assign(State=df.index.get_level_values('State'))
# for all levels
df.assign(**df.index.to_frame())
rename_axis
+ reset_index
Puoi prima rinominare il tuo indice in un'etichetta desiderata, quindi elevare a una serie:
df = df.rename_axis('index1').reset_index()
print(df)
index1 gi ptt_loc
0 0 384444683 593
1 1 384444684 594
2 2 384444686 596
Questo funziona anche per i MultiIndex
frame di dati:
print(df)
# val
# tick tag obs
# 2016-02-26 C 2 0.0139
# 2016-02-27 A 2 0.5577
# 2016-02-28 C 6 0.0303
df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()
print(df)
index1 index2 index3 val
0 2016-02-26 C 2 0.0139
1 2016-02-27 A 2 0.5577
2 2016-02-28 C 6 0.0303
Se si desidera utilizzare il reset_index
metodo e conservare anche l'indice esistente, è necessario utilizzare:
df.reset_index().set_index('index', drop=False)
o per cambiarlo sul posto:
df.reset_index(inplace=True)
df.set_index('index', drop=False, inplace=True)
Per esempio:
print(df)
gi ptt_loc
0 384444683 593
4 384444684 594
9 384444686 596
print(df.reset_index())
index gi ptt_loc
0 0 384444683 593
1 4 384444684 594
2 9 384444686 596
print(df.reset_index().set_index('index', drop=False))
index gi ptt_loc
index
0 0 384444683 593
4 4 384444684 594
9 9 384444686 596
E se vuoi sbarazzarti dell'etichetta dell'indice puoi fare:
df2 = df.reset_index().set_index('index', drop=False)
df2.index.name = None
print(df2)
index gi ptt_loc
0 0 384444683 593
4 4 384444684 594
9 9 384444686 596
df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
p = df1.index.values
df1.insert( 0, column="new",value = p)
df1
new gi ptt
0 0 232 342
1 1 66 56
2 2 34 662
3 3 43 123
Un modo molto semplice per farlo è usare il metodo reset_index (). Per un frame di dati df usare il codice seguente:
df.reset_index(inplace=True)
In questo modo, l'indice diventerà una colonna e, usando inplace come True, questo diventerà un cambiamento permanente.