Chcę uzyskać listę nagłówków kolumnowych z pandas Dataframe. Dataframe będzie pochodzić z wejścia użytkownika, więc nie będę wiedział, ile tam będzie kolumny lub co zostaną wywołane.

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']
1092
natsuki_2002 21 październik 2013, 01:18

19 odpowiedzi

Najlepsza odpowiedź

Możesz uzyskać wartości jako listę, robiąc:

list(my_dataframe.columns.values)

Możesz także użyć: (jak pokazano w Odpowiedź ED Chum):

list(my_dataframe)
1755
cs95 3 kwiecień 2019, 09:51

Istnieje wbudowana metoda, która jest najbardziej wydajna:

my_dataframe.columns.values.tolist()

.columns Zwraca indeks, .columns.values Zwraca tablicę i ma funkcję pomocnika .tolist, aby zwrócić listę.

Jeśli wydajność nie jest tak ważna, Index Obiekty Zdefiniuj metodę .tolist(), którą możesz zadzwonić bezpośrednio:

my_dataframe.columns.tolist()

Różnica w wydajności jest oczywista:

%timeit df.columns.tolist()
16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df.columns.values.tolist()
1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Dla tych, którzy nienawidzą pisania, możesz po prostu zadzwonić list na df, jak:

list(df)
436
cs95 3 kwiecień 2019, 09:26

Zrobili kilka szybkich testów, a być może zaskakująco wbudowaną wersję przy użyciu dataframe.columns.values.tolist() jest najszybszy:

In [1]: %timeit [column for column in df]
1000 loops, best of 3: 81.6 µs per loop

In [2]: %timeit df.columns.values.tolist()
10000 loops, best of 3: 16.1 µs per loop

In [3]: %timeit list(df)
10000 loops, best of 3: 44.9 µs per loop

In [4]: % timeit list(df.columns.values)
10000 loops, best of 3: 38.4 µs per loop

(Nadal naprawdę lubię list(dataframe), więc dzięki Edchum!)

94
tegan 13 marzec 2015, 16:01

Jest jeszcze prostsze (przez pandas 0.16.0):

df.columns.tolist()

Daje Ci nazwy kolumn na ładnej liście.

53
fixxxer 26 kwiecień 2015, 20:23
>>> list(my_dataframe)
['y', 'gdp', 'cap']

Aby wymienić kolumny dataframe w trybie debugera, użyj rozumienia listy:

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']

Nawiasem mówiąc, możesz uzyskać posortowaną listę, używając sorted:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']
39
Alexander 26 styczeń 2018, 22:25

Zaskoczony, że nie widziałem tego do tej pory, więc po prostu zostawię to tutaj.

Rozszerzone iterable rozpakowanie (Python3.5 +): [*df] i przyjaciele

rozpakowanie uogólnienia (PEP 448) zostały wprowadzone z Python 3.5. Możliwe są więc następujące operacje.

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x 

Jeśli chcesz list ....

[*df]
# ['A', 'B', 'C']

Lub, jeśli chcesz set,

{*df}
# {'A', 'B', 'C'}

Lub, jeśli chcesz tuple,

*df,  # Please note the trailing comma
# ('A', 'B', 'C')

Lub, jeśli chcesz gdzieś zapisać wynik,

*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']

... Jeśli jesteś osobą, która konwertuje kawę do pisania dźwięków, cóż, to sprawniej spożywa kawę;)

P.S.: Jeśli wydajność jest ważna, będziesz chciał porzucić powyższe rozwiązania na korzyść

df.columns.to_numpy().tolist()
# ['A', 'B', 'C']

Jest to podobne do Ed Chum Odpowiedz, ale zaktualizowano V0.24 gdzie .to_numpy() jest preferowany do użycia .values. Widzieć Ta odpowiedź (przeze mnie) po więcej informacji.

Wizualny czek
Odkąd widziałem to omawiane w innych odpowiedziach, możesz wykorzystać iterable rozpakowanie (nie ma potrzeby jawnych pętli).

print(*df)
A B C

print(*df, sep='\n')
A
B
C

Krytyka innych metod

Nie używaj jawnej pętli for, aby operacja, którą można wykonać w jednej linii (kompleks listy są w porządku).

Następnie przy użyciu sorted(df) nie zachowuje oryginalnego zamówienia kolumn. Zamiast tego powinieneś użyć list(df).

Następnie list(df.columns) i list(df.columns.values) są słabe sugestie (od aktualnej wersji, V0.24). Zarówno Index (zwrócone z df.columns) i macierzy numpy (zwrócone przez df.columns.values) definiują metodę .tolist(), która jest szybsza i bardziej idiomatyczna.

Wreszcie, listę I.E. list(df) powinna być stosowana jako zwięzła alternatywa dla wyżej wymienionych metod.

34
cs95 2 marzec 2020, 07:50

To jest dostępne jako my_dataframe.columns.

25
BrenBarn 23 styczeń 2014, 18:50

To ciekawe, ale df.columns.values.tolist() jest prawie 3 razy szybsze niż df.columns.tolist(), ale myślałem, że są takie same:

In [97]: %timeit df.columns.values.tolist()
100000 loops, best of 3: 2.97 µs per loop

In [98]: %timeit df.columns.tolist()
10000 loops, best of 3: 9.67 µs per loop
19
Anton Protopopov 4 grudzień 2015, 21:41

A Dataframe podąża za konwencją jak itera klucze "obiektów.

my_dataframe.keys()

Utwórz listę kluczy / kolumn - metoda obiektów to_list() i droga Pythonic

my_dataframe.keys().to_list()
list(my_dataframe.keys())

podstawowa iteracja na dataframe Zwraca etykiety kolumnowe

[column for column in my_dataframe]

Nie konwertuj dataframe na listę, aby uzyskać etykiety kolumn. Nie przestawaj myślenia, szukając wygodnych próbek kodu.

xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))
list(xlarge) #compute time and memory consumption depend on dataframe size - O(N)
list(xlarge.keys()) #constant time operation - O(1)
19
Sascha Gottfried 31 maj 2018, 11:25

W notebooku.

W przypadku eksploracji danych w Notebooku IPython, mój preferowany sposób:

sorted(df)

Który zapewni łatwy do odczytania listy zamówionych alfabetycznie.

W repozytorium kodu

W kodzie uważam, że jest bardziej wyraźny

df.columns

Ponieważ mówi innym, czytając swój kod, co robisz.

14
Community 20 czerwiec 2020, 09:12
%%timeit
final_df.columns.values.tolist()
948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
list(final_df.columns)
14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.columns.values)
1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
final_df.columns.tolist()
12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.head(1).columns)
163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
10
rohit singh 16 kwiecień 2019, 06:32

Ponieważ odpowiedział Simeon Visser ... mógłbyś to zrobić

list(my_dataframe.columns.values) 

Lub

list(my_dataframe) # for less typing.

Ale myślę, że większość słodkiego miejsca jest:

list(my_dataframe.columns)

Jest wyraźny, jednocześnie niepotrzebnie nie długie.

3
Vivek 16 luty 2018, 19:15

Szybki, schludny, wizualny czek, spróbuj tego:

for col in df.columns:
    print col
3
Joseph True 22 sierpień 2018, 16:17

Daje nam to nazwy kolumn na liście:

list(my_dataframe.columns)

Można użyć innej funkcji zwanej Tolist () też:

my_dataframe.columns.tolist()
3
Harikrishna 22 sierpień 2018, 20:23

Czuję pytanie zasługujące na dodatkowe wyjaśnienie.

Ponieważ @fixxxer, odpowiedź zależy od wersji Pandas, której używasz w swoim projekcie. Które możesz uzyskać polecenie pd.__version__.

Jeśli jesteś z jakiegoś powodu jak ja (na Debian Jessie, używam 0,14.1) za pomocą starszej wersji pandy niż 0,16.0, musisz użyć:

df.keys().tolist() Dlatego nie ma jeszcze metody df.columns.

Zaletą tego metody kluczy jest, że działa nawet w nowszej wersji pandy, więc jest bardziej uniwersalny.

2
StefanK 13 grudzień 2017, 14:47

Mimo że rozwiązanie, które zostało podane powyżej, jest miłe. Spodziewałbym się również czegoś takiego jak ramki W jakiś sposób zachowuje uczucie, że korzystasz z pandy w odpowiedni sposób, wywołując funkcję "Tolist": Frame.Columns.Tolist ()

frame.columns.tolist() 
0
Igor Jakovljevic 14 luty 2019, 10:58

Jeśli DataFrame ma miejsce na indeks lub MultiIndeks i chcesz, aby te były również nazwy kolumn:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

Unika dzwonienia do resetowania_index (), który ma niepotrzebne trafienie wydajności dla tak prostej operacji.

Naduszowałem tego częściej, ponieważ spławię dane z baz danych, w których mapy indeksu danych Dataframe do głównego / unikalnego klucza, ale jest dla mnie naprawdę kolejną "kolumną". Prawdopodobnie miałoby to sens dla pandy, aby mieć wbudowaną metodę dla czegoś takiego (całkowicie możliwe, że przegapiłem).

0
totalhack 16 styczeń 2020, 05:24

To rozwiązanie zawiera listę wszystkich kolumn obiektu my_Dataframe:

print(list(my_dataframe))
-1
sɐunıɔןɐqɐp 11 czerwiec 2018, 10:30
n = []
for i in my_dataframe.columns:
    n.append(i)
print n
1
user21988 20 październik 2013, 21:43