Quando si impila un panda DataFrame
, viene restituito un Series
. Normalmente dopo aver impilato uno DataFrame
, lo converto nuovamente in DataFrame
. Tuttavia, i nomi predefiniti provenienti dai dati in pila rendono il cambio di nome delle colonne un po 'hacky. Quello che sto cercando è un modo più semplice/integrato per dare alle colonne nomi sensibili dopo l'impilamento.Impostare i nomi delle colonne quando si impilano i panda DataFrame
Ad esempio, per i seguenti DataFrame
:
In [64]: df = pd.DataFrame({'id':[1,2,3],
...: 'date':['2015-09-31']*3,
...: 'value':[100, 95, 42],
...: 'value2':[200, 57, 27]}).set_index(['id','date'])
In [65]: df
Out[65]:
value value2
id date
1 2015-09-31 100 200
2 2015-09-31 95 57
3 2015-09-31 42 27
ho stack e riconvertirlo in un DataFrame
in questo modo:
In [68]: df.stack().reset_index()
Out[68]:
id date level_2 0
0 1 2015-09-31 value 100
1 1 2015-09-31 value2 200
2 2 2015-09-31 value 95
3 2 2015-09-31 value2 57
4 3 2015-09-31 value 42
5 3 2015-09-31 value2 27
Quindi, al fine di nominare queste colonne in modo appropriato avrei bisogno di fare qualcosa del genere:
In [72]: stacked = df.stack()
In [73]: stacked
Out[73]:
id date
1 2015-09-31 value 100
value2 200
2 2015-09-31 value 95
value2 57
3 2015-09-31 value 42
value2 27
dtype: int64
In [74]: stacked.index.set_names('var_name', level=len(stacked.index.names)-1, inplace=True)
In [88]: stacked.reset_index().rename(columns={0:'value'})
Out[88]:
id date var_name value
0 1 2015-09-31 value 100
1 1 2015-09-31 value2 200
2 2 2015-09-31 value 95
3 2 2015-09-31 value2 57
4 3 2015-09-31 value 42
5 3 2015-09-31 value2 27
Idealmente, la soluzione sarebbe simile a questa:
df.stack(new_index_name='var_name', new_col_name='value')
Ma guardando il docs che non sembra stack
prende tali argomenti. C'è un modo più semplice/integrato nei panda per gestire questo flusso di lavoro?
+1, ma un po 'di elaborazione sarebbe l'ideale. Forse anche capitale inizia i nomi delle colonne come mi sono confuso con così tanti 'value's su. – josh