Dapatkan daftar dari tajuk kolom DataFrame panda

1016

Saya ingin mendapatkan daftar tajuk kolom dari DataFrame panda. DataFrame akan berasal dari input pengguna jadi saya tidak akan tahu berapa banyak kolom akan ada atau apa namanya.

Misalnya, jika saya diberi DataFrame seperti ini:

>>> 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

Saya ingin mendapatkan daftar seperti ini:

>>> header_list
['y', 'gdp', 'cap']
natsuki_2002
sumber

Jawaban:

1647

Anda bisa mendapatkan nilai sebagai daftar dengan melakukan:

list(my_dataframe.columns.values)

Anda juga dapat menggunakan: (seperti yang ditunjukkan dalam jawaban Ed Chum ):

list(my_dataframe)
Simeon Visser
sumber
42
Mengapa dokumen ini tidak memiliki columnsatribut?
Tjorriemorrie
@Tjorriemorrie: Saya tidak yakin, mungkin ada hubungannya dengan cara mereka secara otomatis menghasilkan dokumentasi mereka. Namun disebutkan di tempat lain: pandas.pydata.org/pandas-docs/stable/…
Simeon Visser
8
Saya akan mengharapkan sesuatu seperti df.column_names(). Apakah jawaban ini masih benar atau sudah usang?
alvas
1
@alvas ada berbagai cara lain untuk melakukannya (lihat jawaban lain di halaman ini) tetapi sejauh yang saya tahu tidak ada metode pada dataframe secara langsung untuk menghasilkan daftar.
Simeon Visser
19
Yang penting, ini mempertahankan urutan kolom.
WindChimes
402

Ada metode bawaan yang merupakan yang paling performan:

my_dataframe.columns.values.tolist()

.columnsmengembalikan Indeks, .columns.valuesmengembalikan array dan ini memiliki fungsi pembantu .tolistuntuk mengembalikan daftar.

Jika kinerja tidak terlalu penting bagi Anda, Indexobjek menentukan .tolist()metode yang dapat Anda panggil secara langsung:

my_dataframe.columns.tolist()

Perbedaan kinerja jelas:

%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)

Bagi mereka yang membenci mengetik, Anda hanya dapat memanggil listpada df, sebagai begitu:

list(df)
EdChum
sumber
4
Tidak memilih, tetapi ingin menjelaskan: jangan mengandalkan detail implementasi, gunakan "antarmuka publik" dari DataFrame. Pikirkan tentang keindahan df.keys ()
Sascha Gottfried
3
@SaschaGottfried implementasi DataFrameiterable tidak berubah sejak hari pertama: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . Iterable yang dikembalikan dari DataFrame selalu menjadi kolom, jadi melakukan hal itu for col in df:harus selalu berperilaku sama kecuali jika pengembang mengalami kehancuran seperti list(df)itu dan masih harus menjadi metode yang valid. Perhatikan bahwa df.keys()memanggil implementasi internal struktur seperti dict mengembalikan kunci yang merupakan kolom. Downvotes yang tidak dapat dijelaskan adalah kerusakan jaminan yang diharapkan pada SO jadi jangan khawatir
EdChum
Saya merujuk pada detail implementasi columnsatribut. Satu jam yang lalu saya membaca tentang Hukum Demeter yang mempromosikan bahwa penelepon tidak boleh bergantung pada menavigasi model objek internal. list(df)melakukan konversi tipe eksplisit. Efek samping yang penting: waktu eksekusi dan konsumsi memori meningkat dengan df.keys()metode ukuran dataframe adalah bagian dari sifat dict-like a DataFrame. Fakta penting: waktu eksekusi df.keys()agak konstan terlepas dari ukuran dataframe - bagian dari tanggung jawab pengembang panda.
Sascha Gottfried
1
@ SaschaGottfried Saya dapat menambahkan ini ke jawaban dan kredit saya yang Anda lihat karena tidak ada orang lain yang memasukkan ini
EdChum
1
Saya dapat melihat nilai dalam jawaban yang diberikan serta dalam komentar - tidak perlu mengubah apa pun.
Sascha Gottfried
89

Melakukan beberapa tes cepat, dan mungkin tidak mengherankan versi built-in yang digunakan dataframe.columns.values.tolist()adalah yang tercepat:

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

(Aku masih sangat suka list(dataframe), jadi terima kasih EdChum!)

mulai
sumber
47

Menjadi lebih sederhana (oleh panda 0.16.0):

df.columns.tolist()

akan memberi Anda nama kolom dalam daftar yang bagus.

fixxxer
sumber
37
>>> list(my_dataframe)
['y', 'gdp', 'cap']

Untuk daftar kolom kerangka data saat dalam mode debugger, gunakan pemahaman daftar:

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

Omong-omong, Anda bisa mendapatkan daftar yang diurutkan hanya dengan menggunakan sorted:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']
Alexander
sumber
Apakah itu list(df)hanya berfungsi dengan kerangka data peningkatan otomatis? Atau apakah itu berfungsi untuk semua kerangka data?
alvas
2
Harus bekerja untuk semua. Ketika Anda berada di debugger, Anda harus menggunakan pemahaman daftar [c for c in df].
Alexander
25

Terkejut saya belum melihat ini diposting sejauh ini, jadi saya akan meninggalkan ini di sini.

Extended Iterable Unpacking (python3.5 +): [*df]dan Teman

Generalisasi unpacking (PEP 448) telah diperkenalkan dengan Python 3.5. Jadi, semua operasi berikut ini dimungkinkan.

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 

Jika Anda ingin list....

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

Atau, jika Anda ingin set,

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

Atau, jika Anda ingin tuple,

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

Atau, jika Anda ingin menyimpan hasilnya di suatu tempat,

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

... jika Anda adalah tipe orang yang mengubah kopi menjadi suara mengetik, yah, ini akan mengonsumsi kopi Anda lebih efisien;)

PS: jika kinerjanya penting, Anda ingin membuang solusi di atas yang mendukung

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

Ini mirip dengan jawaban Ed Chum , tetapi diperbarui untuk v0.24 di mana .to_numpy()lebih disukai daripada penggunaan .values. Lihat jawaban ini (oleh saya) untuk informasi lebih lanjut.

Pemeriksaan Visual
Karena saya telah melihat ini dibahas dalam jawaban lain, Anda dapat memanfaatkan pembongkaran iterable (tidak perlu untuk loop eksplisit).

print(*df)
A B C

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

Kritik terhadap Metode Lain

Jangan gunakan forloop eksplisit untuk operasi yang dapat dilakukan dalam satu baris (Daftar pemahaman baik-baik saja).

Selanjutnya, menggunakan sorted(df) tidak mempertahankan urutan asli kolom. Untuk itu, Anda harus menggunakannya list(df).

Berikutnya, list(df.columns)dan list(df.columns.values)saran yang buruk (per versi saat ini, v0.24). Baik Index(dikembalikan dari df.columns) dan array NumPy (dikembalikan oleh df.columns.values) mendefinisikan .tolist()metode yang lebih cepat dan lebih idiomatik.

Terakhir, listification yaitu, list(df)seharusnya hanya digunakan sebagai alternatif ringkas untuk metode yang disebutkan sebelumnya untuk python <= 3,4 di mana perpanjangan pembongkaran tidak tersedia.

cs95
sumber
24

Itu tersedia sebagai my_dataframe.columns.

BrenBarn
sumber
1
Dan secara eksplisit sebagai daftar olehheader_list = list(my_dataframe.columns)
yeliabsalohcin
^ Atau lebih baik lagi: df.columns.tolist().
cs95
18

Ini menarik tetapi df.columns.values.tolist()hampir 3 kali lebih cepat dari itu df.columns.tolist()tetapi saya pikir mereka sama:

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
Anton Protopopov
sumber
2
Pengaturan waktu sudah dicakup dalam jawaban ini . Alasan perbedaan adalah karena .valuesmengembalikan array numpy yang mendasarinya, dan melakukan sesuatu dengan numpy hampir selalu lebih cepat daripada melakukan hal yang sama dengan panda secara langsung.
cs95
17

Sebuah DataFrame berikut dict-seperti konvensi iterasi “kunci” dari objek tersebut.

my_dataframe.keys()

Buat daftar kunci / kolom - metode objek to_list()dan cara pythonic

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

Iterasi dasar pada DataFrame mengembalikan label kolom

[column for column in my_dataframe]

Jangan mengonversi DataFrame menjadi daftar, hanya untuk mendapatkan label kolom. Jangan berhenti berpikir sambil mencari contoh kode yang mudah.

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)
Sascha Gottfried
sumber
2
Tes saya menunjukkan df.columnsjauh lebih cepat daripada df.keys(). Tidak yakin mengapa mereka memiliki fungsi dan atribut untuk hal yang sama (yah, ini bukan pertama kalinya saya melihat 10 cara berbeda untuk melakukan sesuatu dalam panda).
cs95
1
Tujuan dari jawaban saya adalah untuk menunjukkan beberapa cara untuk menanyakan label kolom dari DataFrame dan menyoroti anti-pola kinerja. Namun demikian saya menyukai komentar Anda dan meningkatkan jawaban Anda baru-baru ini - karena mereka memberikan nilai dari sudut pandang rekayasa perangkat lunak.
Sascha Gottfried
14

Di dalam Notebook

Untuk eksplorasi data di notebook IPython, cara pilihan saya adalah ini:

sorted(df)

Yang akan menghasilkan daftar urutan abjad yang mudah dibaca.

Dalam repositori kode

Dalam kode saya merasa lebih eksplisit untuk dilakukan

df.columns

Karena itu memberitahu orang lain membaca kode Anda apa yang Anda lakukan.

firelynx
sumber
sorted(df)mengubah urutan. Gunakan dengan hati-hati.
cs95
@coldspeed Saya menyebutkan ini meskipun "Yang akan menghasilkan daftar urutan abjad yang mudah dibaca."
firelynx
9
%%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)
rohit singh
sumber
3

seperti yang dijawab oleh Simeon Visser ... Anda bisa melakukannya

list(my_dataframe.columns.values) 

atau

list(my_dataframe) # for less typing.

Tapi saya pikir sebagian besar sweet spot adalah:

list(my_dataframe.columns)

Ini eksplisit, pada saat yang sama tidak perlu terlalu lama.

Vivek
sumber
"Itu eksplisit, pada saat yang sama tidak perlu terlalu lama." Saya tidak setuju. Panggilan listtidak ada gunanya kecuali Anda memanggilnya secara dflangsung (misalnya, keringkasan). Mengakses .columnsatribut mengembalikan Indexobjek yang memiliki tolist()metode yang ditentukan di atasnya, dan panggilan yang lebih idiomatis daripada mendaftar Index. Memadukan idiom hanya demi kelengkapan bukanlah ide bagus. Hal yang sama berlaku untuk daftar array yang Anda dapatkan .values.
cs95
3

Untuk pemeriksaan visual yang cepat, rapi, coba ini:

for col in df.columns:
    print col
Joseph True
sumber
3

Ini memberi kami nama-nama kolom dalam daftar:

list(my_dataframe.columns)

Fungsi lain yang disebut tolist () dapat digunakan juga:

my_dataframe.columns.tolist()
Harikrishna
sumber
Ini sudah tercakup dalam jawaban lain. Solusi pertama Anda juga mencampur idiom, yang bukan ide bagus. Lihat komentar saya di bawah jawaban lain.
cs95
2

Saya merasa pertanyaan layak mendapatkan penjelasan tambahan.

Seperti yang dicatat oleh @fixxxer, jawabannya tergantung pada versi panda yang Anda gunakan dalam proyek Anda. Yang bisa Anda dapatkan dengan pd.__version__perintah.

Jika Anda karena alasan tertentu seperti saya (pada debian jessie saya menggunakan 0.14.1) menggunakan versi panda lebih lama dari 0.16.0, maka Anda perlu menggunakan:

df.keys().tolist()karena belum ada df.columnsmetode yang diterapkan.

Keuntungan dari metode kunci ini adalah, bahwa ia berfungsi bahkan dalam versi panda yang lebih baru, sehingga lebih universal.

StefanK
sumber
Con of keys () adalah bahwa itu adalah panggilan fungsi daripada pencarian atribut, jadi itu selalu akan lebih lambat. Tentu saja, dengan akses waktu yang konstan, tidak ada yang benar-benar peduli tentang perbedaan seperti ini, tapi saya pikir itu layak untuk disebutkan; df.columns sekarang merupakan idiom yang lebih diterima secara universal untuk mengakses header.
cs95
1
n = []
for i in my_dataframe.columns:
    n.append(i)
print n
pengguna21988
sumber
6
harap ganti dengan pemahaman daftar.
Sascha Gottfried
4
ubah 3 baris pertama Anda ke[n for n in dataframe.columns]
Anton Protopopov
Mengapa Anda ingin melalui semua masalah ini untuk operasi yang dapat Anda lakukan dengan mudah dalam satu baris?
cs95
0

Meskipun solusi yang disediakan di atas bagus. Saya juga berharap sesuatu seperti frame.column_names () menjadi fungsi dalam panda, tetapi karena tidak, mungkin akan lebih baik menggunakan sintaks berikut. Entah bagaimana itu mempertahankan perasaan bahwa Anda menggunakan panda dengan cara yang tepat dengan memanggil fungsi "tolist": frame.columns.tolist ()

frame.columns.tolist() 
Igor Jakovljevic
sumber
0

Jika DataFrame memiliki Indeks atau MultiIndex dan Anda ingin yang dimasukkan sebagai nama kolom juga:

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

Ini menghindari panggilan reset_index () yang memiliki kinerja yang tidak perlu untuk operasi sederhana.

Saya sering mengalami hal ini karena saya menggunakan data dari basis data tempat indeks dataframe dipetakan ke kunci primer / unik, tetapi sebenarnya hanyalah "kolom" bagi saya. Mungkin masuk akal jika panda memiliki metode bawaan untuk hal seperti ini (sangat mungkin saya melewatkannya).

totalhack
sumber
-1

Solusi ini mencantumkan semua kolom objek my_dataframe:

print(list(my_dataframe))
Sunitha G
sumber