У меня есть большой фрейм данных 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
Ваше здоровье
Это тоже работает - как обычно, с кошки снимают шкуру несколькими способами. Это больше соответствует тому, к чему я пытался добраться, поэтому большое спасибо.
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 для комбинаций срезов, но я не мог ее найти. Ваше здоровье
Я понял, что нужно определить конец среза списка (0 в [-n:0]
), но теперь думаю, что понимаю. Еще раз спасибо!
Вы можете использовать это простое решение:
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']
Попробуйте
df.drop(columns=list(df)[3:23]+list(df)[-6:])