Pandalarda bir sütun hariç tüm sütunlar nasıl seçilir?


278

Ben böyle bir veri çerçevesi var:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

Dışındaki tüm sütunları nasıl alabilirim column b?


@ cs95 - Şu anda listelenen yinelenen hedef bir yinelenen değil. Orijinal başlığa rağmen, bağlantılı soru "Neden bu sözdizimi işe yaramıyor" iken, bu soru daha genel bir "Bunu yapmanın en iyi yolu nedir" dir. - Buna mevcut bir DataFrame'den bir sütunu silme ile bir başkasının sütunlarından hepsi bir arada yeni bir DataFrame oluşturma arasındaki farkı ekleyin.
RM

@RM Özür dilerim, ancak bu yazıdaki başlığa yaptığınız düzenlemeye katılmıyorum, bu yüzden geri aldım. OP'nin amacının sözdizimini sorgulamak olduğu doğrudur, ancak gönderi bir sütunun nasıl silineceği konusunda daha geniş bir soruyu ele almak için büyüdü. Bu gönderideki cevaplar, orada en yüksek oyu alan gönderinin karbon kopyalarıdır. Dupe kalır.
cs95

Üzerinde görüşülmekte olan bu soruyu Not Meta .
Heretic Maymun

Yanıtlar:


422

Sütunlar bir MultiIndex olmadığında, df.columnsaşağıdakileri yapabilmeniz için yalnızca bir sütun adı dizisidir:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

13
Kötü değil, ama @ mike'ın çözümünü kullanmak dropdaha iyi IMO. Biraz daha okunabilir ve multiindexes
travc

5
Aslında @ mike'ın çözümünün dropdaha iyi olduğunu kabul ediyorum - (tek seviyeli) sütunların çalışabileceğiniz diziler olduğunu, ancak özellikle bir sütunu bırakmak için dropçok okunabilir olduğunu ve karmaşık dizinlerle iyi çalıştığını keşfetmenin yararlı olduğunu düşünüyorum .
Marius

1
Bu harika cevap için teşekkür ederim. eğer bir başlığım yoksa? nasıl adreslerim?
FabioSpaghetti

1
Yok sayılacak 1'den fazla sütuna sahip olduğunuzda ne olur?
Bruno Ambrozio

227

Kullanma ix. Kullanımdan kaldırıldı . Bunu yapmanın en okunaklı ve deyimsel yolu df.drop():

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

Varsayılan olarak, .drop()yerinde çalışmadığını unutmayın; uğursuz isme rağmen, dfbu süreçten zarar görmez. Kalıcı kaldırmak istiyorsanız bdan dfyapın df.drop('b', inplace=True).

df.drop()etiketlerin bir listesini de kabul eder, örneğin df.drop(['a', 'b'], axis=1)sütun ave b.


1
Ayrıca, beklediğiniz gibi bir multiindex üzerinde de çalışır. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Birden çok sütun (liste) veya bir çoklu dizine (grup) atıfta bulunup bulunmadığınızı belirlemek için list vs tuple gibi görünüyor.
travc

16
Daha okunabilir: df.drop(columns='a')veya df.drop(columns=['a', 'b']). Ayrıca değiştirebilir miyim columns=ile index=.
BallpointBen

Eğer gerçekleşmesi Ancak bu yararlı değil değil yorulana istediğiniz tüm sütunların isimlerini bilmek.
yeliabsalohcin

Bu bir görünüm / başvuru değil bir kopya oluşturduğundan, bir ödevin LHS'sinde bunu kullanarak orijinal veri çerçevesini değiştiremezsiniz.
Jan Christoph Terasa

132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833

9
Birden fazla sütunu atlamak için kullanılabileceğinden bu yaklaşımı seviyorum.
Nischal Hp

3
@NischalHp df.drop, birden fazla df.drop sütununu (['a', 'b'], eksen = 1) atlayabilir
Patrick Li

2
Bunun sütunlarınızı yeniden düzenleyebileceğini belirtmek gerekir
ocean800

1
@ ocean800 Evet, bu doğru. Bu sort=Falsedavranıştan kaçınmak istiyorsanız geçebilirsiniz ( df.columns.difference(['b'], sort=False))
ayhan

64

Kullanabilirsiniz df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

Birden fazla sütunu bırakmak istediğinizde, aşağıdaki kadar basit:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]

12

İşte başka bir yol:

df[[i for i in list(df.columns) if i != '<your column>']]

Sadece gösterilmesini istemediğiniz sütunlar hariç tüm sütunları geçirmeniz yeterlidir.


5

@Salvador Dali'de yapılan bir başka küçük değişiklik, hariç tutulan sütunların bir listesini sağlar:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

veya

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

4

Bence bunu yapmanın en iyi yolu @Salvador Dali tarafından belirtilen yöntemdir. Diğerleri yanlış değil.

Çünkü sadece bir sütun seçmek ve onu bir değişkene ve geri kalan sütunları diğerine koymak veya karşılaştırmak veya hesaplamak amacıyla koymak istediğiniz bir veri kümeniz olduğunda. Sonra veri kümesinin sütununu bırakmak yardımcı olmayabilir. Tabii bunun için de kullanım örnekleri var.

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

Ardından, bu sütun koleksiyonunu diğer hesaplama x_colsgibi başka bir değişkene yerleştirebilirsiniz x_cols1.

ex: x_cols1 = data[x_cols]

Bunun Salvador'un cevabına yaptığı bir yorum / uzantı yerine neden ayrı bir cevap olduğunu açıklayabilir misiniz?

3

İşte bir satır lambda:

df[map(lambda x :x not in ['b'], list(df.columns))]

önce :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

sonra :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
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.