Panda DataFrame sütun başlıklarından liste al


1014

Bir panda DataFrame sütun başlıklarının bir listesini almak istiyorum. DataFrame kullanıcı girişinden gelecek, bu yüzden kaç tane sütun olacağını ya da ne adlandırılacağını bilmiyorum.

Örneğin, böyle bir DataFrame verildiğinde:

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

Böyle bir liste almak istiyorum:

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

Yanıtlar:


1646

Aşağıdakileri yaparak değerleri bir liste olarak alabilirsiniz:

list(my_dataframe.columns.values)

Ayrıca şunları kullanabilirsiniz: ( Ed Chum'un cevabında gösterildiği gibi ):

list(my_dataframe)

42
Neden gelmez bu doktor yok columnsöznitelik olarak?
Tjorriemorrie

@Tjorriemorrie: Emin değilim, belgelerini otomatik olarak oluşturma yöntemleri ile ilgili olabilir. Yine de başka yerlerde bahsediliyor: pandas.pydata.org/pandas-docs/stable/…
Simeon Visser

8
Böyle bir şey beklerdim df.column_names(). Bu cevap hala doğru mu yoksa güncel değil mi?
alvas

1
@alvas bunu yapmanın başka yolları da var (bu sayfadaki diğer cevaplara bakın) ama bildiğim kadarıyla doğrudan veri çerçevesi üzerinde listeyi üretmek için bir yöntem yok.
Simeon Visser

19
Daha da önemlisi, bu sütun sırasını korur.
WindChimes

402

En performanslı olan yerleşik bir yöntem vardır:

my_dataframe.columns.values.tolist()

.columnsbir Dizin .columns.valuesdöndürür, bir dizi döndürür ve bunun .tolistbir liste döndürmek için yardımcı işlevi vardır .

Performans sizin için önemli değilse, Indexnesneler .tolist()doğrudan arayabileceğiniz bir yöntem tanımlar :

my_dataframe.columns.tolist()

Performans farkı açıktır:

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

Yazmaya nefret edenler için, sadece çağırabilir listüzerinde dfböylece,:

list(df)

4
Oy kullanmadı, ancak açıklamak istiyorum: uygulama ayrıntılarına güvenmeyin, DataFrame'in "genel arabirimini" kullanın. Df.keys () 'in güzelliğini düşünün
Sascha Gottfried

3
@SaschaGott, tekrarlanabilir uygulama DataFrameilk günden beri değişmedi: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . Bir DataFrame döndürülen yinelenebilir her zaman sütunlar olmuştur, bu yüzden for col in df:geliştiriciler bir erime olmadıkça list(df)ve hala geçerli bir yöntem olması gerektiği sürece yapmak her zaman aynı davranmalıdır . df.keys()Sütun olan anahtarları döndüren diktese benzer yapının dahili uygulamasını çağırdığını unutmayın . Açıklanamayan inişler, SO'da beklenecek teminat hasarıdır, bu yüzden endişelenmeyin
EdChum

columnsÖzniteliğin uygulama detaylarından bahsediyordum . Bir saat önce arayanın dahili nesne modelinde gezinmeye bağlı olmaması gerektiğini teşvik eden Demeter Yasası'nı okudum. list(df)açık tip dönüşümü yapar. Önemli yan etki: veri çerçevesi boyutu df.keys()yöntemi ile yürütme süresi ve bellek tüketimi artışı a DataFrame. Dikkate değer gerçek: df.keys()veri çerçevesi boyutuna bakılmaksızın yürütme süresi oldukça sabittir - panda geliştiricilerinin sorumluluğunun bir parçasıdır.
Sascha Gottfried

1
@SaschaGottfried Bunu cevabıma ekleyebilirim ve başka hiç kimse buna dahil olmadığına göre gördüğünüz krediyi ekleyebilirim
EdChum

1
Verilen cevabın yanı sıra yorumlarda da değer görebiliyorum - hiçbir şeyi değiştirmeye gerek yok.
Sascha Gottfried

89

Bazı hızlı testler yaptım ve belki de şaşırtıcı bir şekilde yerleşik sürümü kullanmak dataframe.columns.values.tolist()en hızlısıdır:

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

(Yine de gerçekten hoşuma gidiyor list(dataframe), bu yüzden teşekkürler EdChum!)


47

Daha da basitleşiyor (pandalar 0.16.0 tarafından):

df.columns.tolist()

size güzel bir listedeki sütun adlarını verecektir.


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

Hata ayıklayıcı modundayken bir veri çerçevesinin sütunlarını listelemek için bir liste kavrama kullanın:

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

Bu arada, aşağıdakileri kullanarak sıralı bir liste alabilirsiniz sorted:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']

Bu list(df)yalnızca otomatik içe aktarma veri çerçeveleriyle çalışır mı? Yoksa tüm veri çerçeveleri için mi çalışıyor?
alvas

2
Herkes için çalışmalı. Ancak hata ayıklayıcıdayken, bir liste kavrayıcı kullanmanız gerekir [c for c in df].
Alexander

25

Şimdiye kadar bunun yayınlandığını görmedim, bu yüzden burada bırakacağım.

Genişletilmiş Tekrarlanabilir Paket Açma (python3.5 +): [*df]ve Arkadaşlar

Ambalajdan çıkarma genellemeleri (PEP 448) Python 3.5 ile sunulmuştur. Böylece, aşağıdaki işlemlerin hepsi mümkündür.

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 

İsterseniz bir list....

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

Veya, isterseniz set,

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

Veya, isterseniz tuple,

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

Ya da sonucu bir yerde saklamak istiyorsanız,

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

... kahveyi ses yazmaya dönüştürebilecek türden biriyseniz, bu kahvenizi daha verimli tüketir;)

Not: performans önemliyse, yukarıdaki çözümleri lehine çıkarmak isteyeceksiniz.

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

Bu benzer Ed Chum cevabı , ancak v0.24 için güncellenmiş .to_numpy()kullanımı tercih edilir .values. Daha fazla bilgi için bu yanıta (benim tarafımdan) bakınız .

Görsel Kontrol
Diğer yanıtlarda tartışıldığını gördüğüm için, tekrarlanabilir ambalajlardan faydalanabilirsiniz (açık döngülere gerek yoktur).

print(*df)
A B C

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

Diğer Yöntemlerin Eleştirisi

forTek bir satırda yapılabilen bir işlem için açık bir döngü kullanmayın (Liste kavramaları uygundur).

Daha sonra, kullanmak sütunların sorted(df) orijinal sırasını korumaz . Bunun için kullanmalısınız list(df).

Sonra list(df.columns)ve list(df.columns.values)zayıf önerilerdir (mevcut sürüm itibariyle, v0.24). Hem Index(döndürülen df.columns) hem de NumPy dizileri (döndürülen df.columns.values) .tolist(), daha hızlı ve daha deyimsel olan yöntemi tanımlar .

Son olarak, listeleme yani, list(df)genişletilmiş ambalajın açılmasının mümkün olmadığı yerlerde, <= 3.4 python için yukarıda bahsedilen yöntemlere kısa bir alternatif olarak kullanılmalıdır.



18

Bu ilginç ama df.columns.values.tolist()neredeyse 3 kat daha hızlı df.columns.tolist()ama aynı olduklarını düşündüm:

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

2
Bu cevapta zamanlamalar zaten ele alınmıştır . Tutarsızlığın nedeni .valuesaltta yatan numpy dizisini döndürür ve numpy ile bir şey yapmak hemen hemen her zaman pandalarla aynı şeyi yapmaktan daha hızlıdır.
cs95

17

Bir DataFrame , nesnelerin “anahtarları” üzerinde yinelemenin dikte benzeri kuralını izler.

my_dataframe.keys()

Anahtar / sütun listesi oluşturma - nesne yöntemi to_list()ve pitonik yol

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

Bir DataFrame'deki temel yineleme sütun etiketlerini döndürür

[column for column in my_dataframe]

Yalnızca sütun etiketlerini almak için DataFrame'i bir listeye dönüştürmeyin. Uygun kod örnekleri ararken düşünmeyi bırakmayın.

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)

2
Testlerim df.columnsçok daha hızlı df.keys(). Neden aynı şey için bir işlev ve özniteliğe sahip olduklarından emin değilim (pandalarda bir şey yapmanın ilk 10 yolu görmedim).
cs95

1
Cevabımın amacı, bir DataFrame'den sütun etiketlerini sorgulamak ve bir performans anti-desenini vurgulamak için birkaç yol göstermekti. Bununla birlikte, yorumlarınızı beğendim ve son yanıtınızı iptal ettim - çünkü yazılım mühendisliği açısından değer sağlıyorlar.
Sascha Gottfried

14

Not Defterinde

IPython not defterinde veri araştırması için tercih ettiğim yol şudur:

sorted(df)

Hangi alfabetik sıralı bir liste okumak için kolay üretecek.

Kod deposunda

Kodda yapmak daha açık buluyorum

df.columns

Çünkü başkalarına ne yaptığınızı kodunuzu okumasını söyler.


sorted(df)değişiklik sırası. Dikkatle kullanın.
cs95

@coldspeed Bunu "Alfabetik sıralı bir liste okunması kolay olacaktır."
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)

3

Simeon Visser tarafından cevaplandığı gibi ...

list(my_dataframe.columns.values) 

veya

list(my_dataframe) # for less typing.

Ama bence en tatlı nokta:

list(my_dataframe.columns)

Açıktır, aynı zamanda gereksiz yere uzun değildir.


"Açıktır, aynı zamanda gereksiz yere uzun değildir." Katılmıyorum. Arama listbunu çağıran sürece hiçbir yararı vardır df(kısalık, örneğin,) doğrudan. .columnsÖzniteliğe erişmek, üzerinde tanımlanmış Indexbir tolist()yöntemi olan bir nesneyi döndürür ve çağırmak, listelemekten daha deyimseldir Index. Deyimleri sadece bütünlük uğruna karıştırmak harika bir fikir değildir. Aldığınız diziyi listelemek için de aynı şey geçerlidir .values.
cs95

3

Hızlı, temiz, görsel bir kontrol için şunu deneyin:

for col in df.columns:
    print col

3

Bu bize bir listedeki sütunların adlarını verir:

list(my_dataframe.columns)

Tolist () adı verilen başka bir işlev de kullanılabilir:

my_dataframe.columns.tolist()

Bu zaten diğer cevaplarda ele alındı. İlk çözümünüz de harika bir fikir olmayan deyimleri karıştırıyor. Benim Bkz yorumunu başka bir yanıt altında.
cs95

2

Sorunun ek açıklamayı hak ettiğini hissediyorum.

@Fixxxer'in belirttiği gibi, cevap projenizde kullandığınız panda sürümüne bağlıdır. Hangi pd.__version__komut ile alabilirsiniz .

Benim gibi bir nedenden dolayı (debian jessie'de 0.14.1 kullanıyorum) 0.16.0'dan daha eski pandalar sürümünü kullanıyorsanız, kullanmanız gerekir:

df.keys().tolist()çünkü df.columnshenüz uygulanmış bir yöntem yok.

Bu tuşlar yönteminin avantajı, pandaların daha yeni sürümlerinde bile çalışmasıdır, bu yüzden daha evrenseldir.


Keys () con, bir özellik arama yerine bir işlev çağrısı olmasıdır, bu yüzden her zaman daha yavaş olacaktır. Tabii ki, sürekli zaman erişimiyle, hiç kimse bu gibi farklılıkları umursamıyor, ama yine de bahsetmeye değer; df.columns artık başlıklara erişmek için daha evrensel olarak kabul edilen bir deyimdir.
cs95

1
n = []
for i in my_dataframe.columns:
    n.append(i)
print n

6
lütfen bunu bir liste kavrayışı ile değiştirin.
Sascha Gottfried

4
ilk 3 satırını değiştir[n for n in dataframe.columns]
Anton Protopopov

Neden tek bir satırda kolayca yapabileceğiniz bir işlem için tüm bu sorundan geçmek istesin ki?
cs95

0

Yukarıda verilen çözüm güzel olsa da. Ayrıca frame.column_names () gibi bir şeyin pandalarda bir işlev olmasını beklerdim, ancak olmadığı için belki de aşağıdaki sözdizimini kullanmak güzel olurdu. Bir şekilde "tolist" işlevini çağırarak pandaları doğru şekilde kullandığınız hissini korur: frame.columns.tolist ()

frame.columns.tolist() 

0

DataFrame bir Dizin veya MultiIndex içeriyorsa ve bunların sütun adları olarak dahil edilmesini istiyorsanız:

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

Bu kadar basit bir işlem için gereksiz performans isabeti olan reset_index () çağrılmasını önler.

Ben veri çerçevesi dizini birincil / benzersiz bir anahtar eşler, ama gerçekten bana sadece başka bir "sütun" olduğu veritabanlarından veri kepenk çünkü bu daha sık ihtiyaç duyuyorum. Pandaların böyle bir şey için yerleşik bir yönteme sahip olması muhtemelen mantıklı olacaktır (tamamen kaçırdım).


-1

Bu çözüm, my_dataframe nesnenizin tüm sütunlarını listeler:

print(list(my_dataframe))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.