Pytanie Jak po prostu dodać poziom kolumny do pandasowej ramki danych


powiedzmy, że mam ramkę danych, która wygląda tak:

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)})
 df
Out[92]: 
   A  B
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

Asumming, że ta ramka danych już istnieje, jak mogę po prostu dodać poziom "C" do indeksu kolumny, więc otrzymuję to:

 df
Out[92]: 
   A  B
   C  C
a  0  0
b  1  1
c  2  2
d  3  3
e  4  4

Widziałem takiego anwsera python / pandy: jak połączyć dwie ramki danych w jedną z hierarchicznym indeksem kolumny? ale to konkatruje inną ramkę danych zamiast dodawać poziom kolumn do już istniejącej ramki danych.

-


18
2017-10-24 19:03


pochodzenie




Odpowiedzi:


Jak sugeruje sam @StevenG, lepsza odpowiedź:

df.columns = pd.MultiIndex.from_product([df.columns, ['C']])

print(df)
#    A  B
#    C  C
# a  0  0
# b  1  1
# c  2  2
# d  3  3
# e  4  4

18
2017-10-24 19:12



to jest świetne, lubię pd.MultiIndex.from_product([df.columns, ['C']]) który jest bity bardziej banalne, ponieważ nie musisz śledzić len z df.columns. czy chcesz dodać to do odpowiedzi, abym mógł to zaakceptować? - Steven G
@StevenG super Nie znałem tej sztuczki. Dzięki, nauczyłem się czegoś nowego :-) - Romain
Czy masz jakieś wskazówki, jak dodać kolejny poziom, gdy oryginalny df ma już nazwy kolumn z wielomaindeksami? Próbowałem dodać nowy poziom za pomocą metody from_product (), jednak otrzymałem ten komunikat o błędzie: "NotImplementedError: isnull nie jest zdefiniowany dla MultiIndex". - Lenka Vraná


opcja 1
set_index i T

df.T.set_index(np.repeat('C', df.shape[1]), append=True).T

Opcja 2
pd.concat, keys, i swaplevel 

pd.concat([df], axis=1, keys=['C']).swaplevel(0, 1, 1)

enter image description here


6
2017-10-24 19:19



Dzięki nie wiedziałem o zamianie i jest to wygodne. Przetestowałem go pod kątem dużej ramki danych, aby sprawdzić, czy jest bardziej wydajny niż ustawienie pd.MultiIndex.from_product([df.columns, ['C']]) i było o 25% wolniejsze. - Steven G
Bez niespodzianek! Odpowiedź Romaina jest szybsza. Dodałem to, ponieważ uważam, że warto to wiedzieć. - piRSquared
pd.concat([df], axis=1, keys=['C']) działa bardzo dobrze na wielopoziomowych kolumnach - Justislav Bogevolnov