Подтвердить что ты не робот

Как выбрать все столбцы, кроме одного столбца в pandas?

У меня есть dataframe, который выглядит так:

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?

4b9b3361

Ответ 1

Если у вас нет 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

Ответ 2

Не используйте 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.

Ответ 3

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

Ответ 4

Вы можете использовать df.columns.isin()

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

Когда вы хотите удалить несколько столбцов, просто:

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

Ответ 5

Вот еще один способ:

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

Вы просто передаете все столбцы, которые будут отображаться, за исключением того, который вам не нужен.

Ответ 6

Еще одно небольшое изменение в @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]]]

Ответ 7

Я думаю, что лучший способ сделать это - путь, упомянутый Сальвадором Дали. Не то чтобы другие не правы.

Потому что, когда у вас есть набор данных, в котором вы просто хотите выбрать один столбец и поместить его в одну переменную, а остальные столбцы - в другую для сравнения или в вычислительных целях. Тогда удаление столбца набора данных может не помочь. Конечно, для этого есть варианты использования.

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]

Ответ 8

Вот одна строка лямбда:

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