Chcę uzyskać listę nagłówków kolumn z pandy DataFrame. DataFrame będzie pochodzić z danych wprowadzanych przez użytkownika, więc nie będę wiedział, ile kolumn będzie i jak będą one nazywane.
Na przykład, jeśli otrzymam DataFrame w ten sposób:
>>> my_dataframe
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Chciałbym uzyskać taką listę:
>>> header_list
['y', 'gdp', 'cap']
columns
jako atrybutu?df.column_names()
. Czy ta odpowiedź jest nadal poprawna, czy jest nieaktualna?Istnieje wbudowana metoda, która jest najbardziej wydajna:
.columns
zwraca indeks,.columns.values
zwraca tablicę, która ma funkcję pomocniczą,.tolist
która zwraca listę.Jeśli wydajność nie jest dla Ciebie tak ważna,
Index
obiekty definiują.tolist()
metodę, którą można wywołać bezpośrednio:Różnica w wydajności jest oczywista:
Dla tych, którzy nie lubią pisać, można po prostu zadzwonić
list
nadf
, a więc:źródło
DataFrame
nie zmieniło się od pierwszego dnia: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . Iterowalną wartością zwracaną z DataFrame zawsze były kolumny, więc działaniefor col in df:
powinno zawsze zachowywać się tak samo, chyba że programiści mają takie załamanielist(df)
i nadal powinna być poprawną metodą. Zauważ, żedf.keys()
wywołuje wewnętrzną implementację struktury przypominającej dict, zwracając klucze, które są kolumnami. Niewytłumaczalne negatywne opinie to dodatkowe szkody, których należy się spodziewać na SO, więc nie martw sięcolumns
atrybutu. Godzinę temu czytałem o prawie Demeter promującym, że osoba dzwoniąca nie powinna polegać na nawigacji po wewnętrznym modelu obiektowym.list(df)
dokonuje jawnej konwersji typu. Znaczący efekt uboczny: czas wykonania i wzrost zużycia pamięci przy metodzie rozmiaru ramkidf.keys()
danych jest częścią dyktatorskiej natury aDataFrame
. Godny uwagi fakt: czas wykonaniadf.keys()
jest raczej stały, niezależnie od wielkości ramki danych - część odpowiedzialności twórców pand.Przeprowadziłem kilka szybkich testów i być może nie jest zaskoczeniem, że wbudowana wersja
dataframe.columns.values.tolist()
jest najszybsza:(Wciąż jednak bardzo mi się podoba
list(dataframe)
, więc dzięki EdChum!)źródło
To staje się jeszcze prostsze (według pand 0.16.0):
poda ci nazwy kolumn na ładnej liście.
źródło
Aby wyświetlić listę kolumn ramki danych w trybie debuggera, skorzystaj ze zrozumienia listy:
Nawiasem mówiąc, możesz uzyskać posortowaną listę, po prostu używając
sorted
:źródło
list(df)
działałoby to tylko w przypadku ramek danych z autoinkrementacją? Czy działa to dla wszystkich ramek danych?[c for c in df]
.Zaskoczony, jak dotąd nie widziałem tego, więc zostawię to tutaj.
Extended Iterable Unpacking (python3.5 +):
[*df]
and FriendsRozpakowywanie uogólnień (PEP 448) zostało wprowadzone w Pythonie 3.5. Zatem wszystkie poniższe operacje są możliwe.
Jeśli chcesz
list
....Lub, jeśli chcesz
set
,Lub, jeśli chcesz
tuple
,Lub, jeśli chcesz gdzieś zapisać wynik,
... jeśli jesteś typem osoby, która zamienia kawę na dźwięki pisania, cóż, dzięki temu będziesz spożywać kawę bardziej efektywnie;)
Kontrola wizualna
Ponieważ widziałem to omówione w innych odpowiedziach, możesz użyć iterowalnego rozpakowywania (nie ma potrzeby jawnych pętli).
Krytyka innych metod
Nie używaj wyraźnej
for
pętli dla operacji, które można wykonać w jednym wierszu (rozumienie listy jest w porządku).Następnie użycie
sorted(df)
nie zachowuje oryginalnej kolejności kolumn. W tym celu należy użyćlist(df)
zamiast tego.Dalej,
list(df.columns)
ilist(df.columns.values)
są kiepskie sugestie (od bieżącej wersji, v0.24). ZarównoIndex
(zwrócone zdf.columns
), jak i NumPy (zwrócone przezdf.columns.values
) definiują.tolist()
metodę, która jest szybsza i bardziej idiomatyczna.Wreszcie, listifikacja, tj.
list(df)
Powinna być używana jedynie jako zwięzła alternatywa dla wyżej wymienionych metod dla Pythona <= 3.4, gdzie rozszerzone rozpakowywanie nie jest dostępne.źródło
To jest dostępne jako
my_dataframe.columns
.źródło
header_list = list(my_dataframe.columns)
df.columns.tolist()
.To ciekawe, ale
df.columns.values.tolist()
jest prawie 3 razy szybsze,df.columns.tolist()
ale myślałem, że są takie same:źródło
.values
zwraca podstawową tablicę numpy, a robienie czegoś za pomocą numpy jest prawie zawsze szybsze niż robienie tego samego z pandami bezpośrednio.DataFrame następuje dict-Like konwencji iteracji nad „klucze” z przedmiotami.
Utwórz listę kluczy / kolumn - metoda obiektowa
to_list()
i sposób pythonowyPodstawowa iteracja na DataFrame zwraca etykiety kolumn
Nie konwertuj DataFrame na listę, aby uzyskać etykiety kolumn. Nie przestawaj myśleć, szukając wygodnych próbek kodu.
źródło
df.columns
jest dużo szybszy niżdf.keys()
. Nie jestem pewien, dlaczego mają zarówno funkcję, jak i atrybut tej samej rzeczy (cóż, nie po raz pierwszy widziałem 10 różnych sposobów robienia czegoś w pandach).W notatniku
Do eksploracji danych w notatniku IPython preferuję:
Które stworzy czytelną listę uporządkowaną alfabetycznie.
W repozytorium kodu
W kodzie uważam, że jest to bardziej wyraźne
Ponieważ mówi innym, czytając twój kod, co robisz.
źródło
sorted(df)
zmienia kolejność. Używaj ostrożnie.źródło
jak odpowiedział Simeon Visser ... możesz to zrobić
lub
Ale myślę, że najbardziej podoba się to:
Jest to wyraźne, a jednocześnie niepotrzebnie długie.
źródło
list
nie ma żadnej wartości, chyba że dzwoniszdf
bezpośrednio (na przykład zwięzłość). Uzyskiwanie dostępu do.columns
atrybutu zwracaIndex
obiekt, który matolist()
zdefiniowaną metodę, a wywoływanie jest bardziej idiomatyczne niż wyświetlanie listyIndex
. Mieszanie idiomów dla samej kompletności nie jest świetnym pomysłem. To samo dotyczy listowania tablicy, którą otrzymujesz.values
.Aby szybko, schludnie i wizualnie sprawdzić, spróbuj tego:
źródło
To daje nam nazwy kolumn na liście:
Można również użyć innej funkcji o nazwie tolist ():
źródło
Wydaje mi się, że pytanie zasługuje na dodatkowe wyjaśnienie.
Jak zauważył @fixxxer, odpowiedź zależy od wersji pandy, której używasz w swoim projekcie. Które można uzyskać za pomocą
pd.__version__
polecenia.Jeśli jesteś z jakiegoś powodu takiego jak ja (na Debianie Jessie używam 0.14.1), używając starszej wersji pand niż 0.16.0, musisz użyć:
df.keys().tolist()
ponieważ nie madf.columns
jeszcze zaimplementowanej metody.Zaletą tej metody kluczy jest to, że działa ona nawet w nowszej wersji pand, więc jest bardziej uniwersalna.
źródło
źródło
[n for n in dataframe.columns]
Mimo że powyższe rozwiązanie jest dobre. Spodziewałbym się również, że coś w rodzaju frame.column_names () będzie funkcją w pandach, ale skoro tak nie jest, być może lepiej byłoby użyć następującej składni. W pewien sposób zachowuje wrażenie, że używasz pand we właściwy sposób, wywołując funkcję „tolist”: frame.columns.tolist ()
źródło
Jeśli zdarzenie DataFrame ma indeks lub indeks MultiIndex, a Ty chcesz, aby te również zostały uwzględnione jako nazwy kolumn:
Pozwala to uniknąć wywoływania reset_index (), który ma niepotrzebny spadek wydajności w przypadku tak prostej operacji.
Potrzebuję tego częściej, ponieważ przesyłam dane z baz danych, w których indeks ramki danych jest mapowany na klucz podstawowy / unikalny, ale tak naprawdę jest to dla mnie kolejna „kolumna”. Prawdopodobnie sensownym byłoby, gdyby pandy miały wbudowaną metodę dla czegoś takiego (całkowicie możliwe, że tego nie zauważyłem).
źródło
To rozwiązanie wyświetla wszystkie kolumny obiektu my_dataframe:
źródło