Як вибрати всі стовпці, крім одного стовпця в пандах?


278

У мене є такий кадр даних:

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

Як я можу отримати всі стовпці, крім column b?


@ cs95 - перерахована на даний момент ціль дубліката не є дублікатом. Незважаючи на оригінальну назву, пов'язане питання "Чому цей конкретний синтаксис не працює", тоді як це питання є більш загальним "Який найкращий спосіб зробити це". - Додайте до цього різницю між видаленням стовпця з існуючої DataFrame порівняно із створенням нового DataFrame з усіма, але одним із стовпців іншого.
РМ

@RM Вибачте, але я не згоден з редакцією, яку ви внесли до заголовку на цій посаді, тому я відкрутив її назад. Це правда, що задум ОП полягав у тому, щоб поставити під сумнів синтаксис, але публікація виросла для вирішення більш широкого питання про те, як видалити стовпець. Відповіді в цій публікації - це копії найвищої інформації там. Дупа залишається.
cs95

Зауважте, це питання обговорюється в Meta .
Єретична мавпа

Відповіді:


421

Коли стовпці не є MultiIndex, df.columnsце лише масив імен стовпців, щоб ви могли:

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
Непогано, але рішення @ Mike drop- краще ІМО. Трохи більш читабельний і обробляє
багатоіндексні дані

5
Я фактично погоджуюся з тим, що використання рішення @ mike dropкраще - я думаю, що корисно виявити, що (однорівневі) стовпці - це масиви, з якими можна працювати, але спеціально для опускання стовпця dropдуже читабельно і добре працює зі складними індексами.
Маріус

1
Дякую за цю тонку відповідь. що робити, якщо у мене немає заголовка? як я звертатись?
FabioSpaghetti

1
А як бути, якщо у вас є більше 1 стовпця, який потрібно ігнорувати?
Бруно Амброзіо

227

Не використовуйте ix. Це застаріло . Найбільш зрозумілий і ідіоматичний спосіб зробити це 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

Зауважте, що за замовчуванням .drop()не працює на місці; незважаючи на зловісну назву, dfцей процес є неушкодженим. Якщо ви хочете назавжди видалити bз нього df, зробіть це df.drop('b', inplace=True).

df.drop()також приймає список міток, наприклад df.drop(['a', 'b'], axis=1), випадає стовпчик aі b.


1
Також працює на мультиіндекс так само, як ви цього очікували. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Здається, використовувати список проти кортежу, щоб визначити, чи потрібно декілька стовпців (список) або посилається на багатоіндекс (кортеж).
travc

16
Більш зрозумілі: df.drop(columns='a')або df.drop(columns=['a', 'b']). Можна також замінити columns=на index=.
BallpointBen

Однак це не корисно, якщо ви не знаєте назв усіх стовпців, які ви хочете опустити.
yeliabsalohcin

Оскільки це створює копію, а не перегляд / посилання, ви не можете змінити початковий кадр даних, використовуючи це в LHS призначення.
Ян Крістоф Тераса

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
Мені подобається такий підхід, оскільки його можна використовувати, щоб опустити більше одного стовпця.
Nischal Hp

3
@NischalHp df.drop також може опустити більше одного стовпця df.drop (['a', 'b'], вісь = 1)
Патрік Лі

2
Я думаю, що варто відзначити, що це може
переставити

1
@ ocean800 Так, це правда. Ви можете пройти , sort=Falseякщо ви хочете , щоб уникнути такої поведінки ( df.columns.difference(['b'], sort=False))
Айхан

64

Можна використовувати df.columns.isin()

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

Коли ви хочете опустити кілька стовпців, настільки ж просто:

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

12

Ось ще один спосіб:

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

Ви просто передаєте всі стовпці для відображення, крім тієї, яку ви не хочете.


5

Ще одна незначна зміна @Salvador Dali дозволяє списку стовпців виключати:

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

або

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

4

Я думаю, що найкращий спосіб - це спосіб, згаданий @Salvador Dali. Не те, щоб інші помилялися.

Тому що, коли у вас є набір даних, де ви просто хочете вибрати один стовпець і помістити його в одну змінну, а решту стовпців в іншу для порівняння або обчислювальних цілей. Тоді випадання стовпця набору даних може не допомогти. Звичайно, для цього також є випадки використання.

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

Потім ви можете помістити ці колекції стовпців у змінну x_colsв іншу змінну, як x_cols1для інших обчислень.

ex: x_cols1 = data[x_cols]

Чи можете ви пояснити, чому це окрема відповідь замість коментаря / продовження відповіді Сальвадора?

3

Ось один рядок лямбда:

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

перед :

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

після :

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.