Удаление нескольких столбцов Pandas по индексу

У меня есть большой фрейм данных pandas (> 100 столбцов). Мне нужно отбросить различные наборы столбцов, и я надеюсь, что есть способ использовать старый

df.drop(df.columns['slices'],axis=1)

Я создал такие подборки, как:

a = df.columns[3:23]
b = df.colums[-6:]

поскольку a и b представляют собой наборы столбцов, которые я хочу отбросить.

Следующие

list(df)[3:23]+list(df)[-6:]

дает правильный выбор, но я не могу реализовать его с помощью drop:

df.drop(df.columns[list(df)[3:23]+list(df)[-6:]],axis=1)

ValueError: operands could not be broadcast together with shapes (20,) (6,)

Я огляделся, но не получил ответа.

Выбор последних n столбцов и исключение последних n столбцов в фрейме данных

(Ниже относится к полученной мной ошибке):

python numpy ValueError: операнды не могут транслироваться вместе с фигурами

Кажется, что у них похожая проблема, но «фрагменты» не разделены: Удаление нескольких столбцов на основе имен столбцов в Pandas

Ваше здоровье

Попробуйте df.drop(columns=list(df)[3:23]+list(df)[-6:])

Rahul Chawla 09.08.2018 13:43

Это тоже работает - как обычно, с кошки снимают шкуру несколькими способами. Это больше соответствует тому, к чему я пытался добраться, поэтому большое спасибо.

BAC83 09.08.2018 13:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
2
18 954
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

IIUC:

a = df.columns[3:23].values.tolist()
b = df.colums[-6:].values.tolist()

a.extend(b)
df.drop(a,1,inplace=True)

Я сталкивался с подобной проблемой раньше, и у меня были проблемы с этим, но я исправил ее, "вычтя" один df из другого, не уверен, что это сработает для вас, но это сработало для меня:

df = df[~df.index.isin(a.index)]
df = df[~df.index.isin(b.index)]

Это возвращает фрейм данных с удаленными столбцами

df.drop(list(df)[2:5], axis=1)
Ответ принят как подходящий

Вы можете использовать np.r_ для плавного объединения нескольких диапазонов / срезов:

from string import ascii_uppercase

df = pd.DataFrame(columns=list(ascii_uppercase))

idx = np.r_[3:10, -5:0]

print(idx)

array([ 3,  4,  5,  6,  7,  8,  9, -5, -4, -3, -2, -1])

Затем вы можете использовать idx для индексации столбцов и передачи в pd.DataFrame.drop:

df.drop(df.columns[idx], axis=1, inplace=True)

print(df.columns)

Index(['A', 'B', 'C', 'K', 'L', 'M', 'N',
       'O','P', 'Q', 'R', 'S', 'T', 'U'], dtype='object')

Я думал, что будет какая-то функция np для комбинаций срезов, но я не мог ее найти. Ваше здоровье

BAC83 09.08.2018 14:47

Я понял, что нужно определить конец среза списка (0 в [-n:0]), но теперь думаю, что понимаю. Еще раз спасибо!

BAC83 09.08.2018 14:54

Вы можете использовать это простое решение:

cols = [3,7,10,12,14,16,18,20,22]
df.drop(df.columns[cols],axis=1,inplace=True)

результат :

    0   1   2   4   5   6   8   9    11  13      15     17      19       21
0   3   12  10  3   2   1   7   512  64  1024.0  -1.0   -1.0    -1.0    -1.0
1   5   12  10  3   2   1   7   16   2   32.0    32.0   1024.0  -1.0    -1.0
2   5   12  10  3   2   1   7   512  2   32.0    32.0   32.0    -1.0    -1.0
3   5   12  10  3   2   1   7   16   1   32.0    64.0   1024.0  -1.0    -1.0

Как видите, все столбцы с заданным индексом были удалены.

Вы можете заменить значение int именем столбца в вашем массиве, если мы предполагаем, что у вас есть A, B, C ... и т. д., Вы можете заменить значения int в cols, например, следующим образом:

cols = ['A','B','C','F']

Другие вопросы по теме