Jeśli mam indeks kolumn wielopoziomowych:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
za --- + - b | do - + --- + - 0 | 1 | 2) 1 | 3 | 4
Jak mogę upuścić poziom „a” tego indeksu, aby uzyskać:
b | do - + --- + - 0 | 1 | 2) 1 | 3 | 4
droplevel
prace mogą działać na indeksach wielopoziomowych lub kolumnach poprzez parametraxis
.Odpowiedzi:
Możesz użyć
MultiIndex.droplevel
:źródło
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
nie jest już dostępny.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Innym sposobem na usunięcie indeksu jest użycie zrozumienia listy:
Ta strategia jest również przydatna, jeśli chcesz połączyć nazwy z obu poziomów, jak w poniższym przykładzie, w którym dolny poziom zawiera dwa „y”:
Upuszczenie najwyższego poziomu spowoduje pozostawienie dwóch kolumn z indeksem „y”. Można tego uniknąć, łącząc nazwy ze zrozumieniem listy.
To był problem, który miałem po zrobieniu grupy i zajęło mi trochę czasu znalezienie innego pytania, które go rozwiązało. Dostosowałem to rozwiązanie do konkretnego przypadku.
źródło
[col[1] for col in df.columns]
jest bardziej bezpośrednidf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Innym sposobem na to jest ponowne przypisanie
df
na podstawie przekrojudf
przy użyciu metody .xs .źródło
b
), a następnie upuść ten poziom i pozostać z pierwszym poziomem (a
), następujące działania będą działać:df = df.xs('b', axis=1, level=1, drop_level=True)
Począwszy od Pandas 0.24.0 , możemy teraz używać DataFrame.droplevel () :
Jest to bardzo przydatne, jeśli chcesz zachować ciągłość łańcucha metod DataFrame.
źródło
Możesz to również osiągnąć, zmieniając nazwy kolumn:
df.columns = ['a', 'b']
Wymaga to ręcznego kroku, ale może być opcją, szczególnie jeśli ostatecznie zmienisz nazwę swojej ramki danych.
źródło
df.columns.get_level_values(1)
.Mała sztuczka
sum
z użyciem poziomu = 1 (działa, gdy poziom = 1 jest unikalny)Bardziej powszechne rozwiązanie
get_level_values
źródło
Walczyłem z tym problemem, ponieważ nie wiem, dlaczego moja funkcja droplevel () nie działa. Przeanalizuj kilka i dowiedz się, że „a” w tabeli to nazwa kolumn, a „b”, „c” to indeks. Zrób tak, to pomoże
źródło