Как выбрать все столбцы, кроме одного столбца в 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
?
Ответы
Ответ 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