2014-12-05 18 views
5

Próbuję dowiedzieć się, czy istnieje sposób na zmianę nazwy kolumn Pandy podczas próby zresetowania indeksu. Widzę w dokumentacji, że możesz użyć parametru "nazwa", aby ustawić nazwę kolumny indeksu resetowania, jeśli jest tylko jedna kolumna, ale jestem ciekawy, czy jest sposób, aby to zrobić dla wielu kolumn.Jak zmienić nazwę wielu kolumn na indeks resetowania za pomocą pand

Na przykład:

df1 = pd.DataFrame({ 
'A' : ['a1', 'a1', 'a2', 'a3'], 
'B' : ['b1', 'b2', 'b3', 'b4'], 
'D1' : [1,0,0,0], 
'D2' : [0,1,1,0], 
'D3' : [0,0,1,1], 
}) 

df1.set_index(['B','A']).stack().reset_index() 

Wynik pozostawia Państwu:

Out[82]: 
    B A level_2 0 
0 b1 a1  D1 1 
1 b1 a1  D2 0 
2 b1 a1  D3 0 
3 b2 a1  D1 0 
4 b2 a1  D2 1 

Można zrobić:

df1.set_index(['B','A']).stack().reset_index(name='my_col') 

Aby ustawić nazwę ostatniej kolumnie ale Zastanawiam się, czy istnieje sposób, aby użyć tego parametru do ustawienia nazwy kolumny "level_2".

Pierwszą rzeczą, która przyszła mi do głowy było spróbować:

df1.set_index(['B','A']).stack().reset_index(name=['my_col2','my_col']) 

jednak, że nie działa więc szukać innego odwrotnie. Zdaję sobie sprawę, że zawsze mogłem zmienić nazwę kolumny w następnej linii, ale liczyłem na to, że będzie to czystszy sposób w jednym wierszu.

Dzięki! Sam

+0

nie sądzę, że to możliwe, widzisz, 'reset_index()' w kodzie jest rzeczywiście http://pandas.pydata.org/pandas-docs/stable /generated/pandas.Series.reset_index.html, więc masz tylko jedną kolumnę. Co można zrobić, to ustawić nazwy kolumn indeksu serii, a następnie pozostaną jako nazwy kolumn w DataFrame –

Odpowiedz

3

reset_index nie jest wystarczająco silny, aby to zrobić, ale możemy wykorzystać metody rename_axis i rename aby nadać nazwy indeksu i kolumny/seria przed zresetowaniem indeksu; raz nazwy są ustawione prawidłowo, reset_index automatycznie konwertować te nazwy z nazwami kolumn w wyniku:

Tutaj rename_axis daje nazwy indeksu, który jest nieco równoważne df.index.names = ... wyjątkiem w stylu funkcjonalnym; rename daje nazwę obiektu serii:

df1.set_index(['B','A']).stack().rename_axis(['B','A','col2']).rename('col').reset_index() 

# B A col2 col 
#0 b1 a1 D1 1 
#1 b1 a1 D2 0 
#2 b1 a1 D3 0 
#3 b2 a1 D1 0 
#4 b2 a1 D2 1 
# ..