Выбор нескольких столбцов данных по позициям в пандах

У меня есть (большой) фрейм данных. Как я могу выбрать конкретные столбцы по позиции? например, столбцы 1..3, 5, 6

Вместо того, чтобы просто отбрасывать column4, я пытаюсь сделать это таким образом, потому что в моем наборе данных тонна строк, и я хочу выбрать по позиции:

 df=df[df.columns[0:2,4:5]]

но это дает IndexError: too many indices for array

Вход DF

 Col1     Col2     Col3       Col4        Col5       Col6
 1        apple    tomato     pear        banana     banana
 1        apple    grape      nan         banana     banana
 1        apple    nan        banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        avacado  tomato     banana      banana     banana
 1        toast    tomato     banana      banana     banana
 1        grape    tomato     egg         banana     banana

DF выход - желательно

 Col1     Col2     Col3       Col5       Col6
 1        apple    tomato     banana     banana
 1        apple    grape      banana     banana
 1        apple    nan        banana     banana
 1        apple    tomato     banana     banana
 1        apple    tomato     banana     banana
 1        apple    tomato     banana     banana     
 1        avacado  tomato     banana     banana     
 1        toast    tomato     banana     banana     
 1        grape    tomato     banana     banana

5 ответов

То, что вам нужно, это NumPy np.r_

df.iloc[:,np.r_[0:2,4:5]]
Out[265]: 
   Col1     Col2    Col5
0     1    apple  banana
1     1    apple  banana
2     1    apple  banana
3     1    apple  banana
4     1    apple  banana
5     1    apple  banana
6     1  avacado  banana
7     1    toast  banana
8     1    grape  banana

Вы можете выбрать столбцы 0, 1, 4 следующим образом:

df.iloc[:, [0, 1, 4]]

Подробнее об этом вы можете прочитать в разделе "Индексирование и выбор данных".

• iloc в первую очередь основан на целочисленной позиции (от 0 до length-1 оси), но также может использоваться с логическим массивом..iloc вызовет IndexError, если запрошенный индексатор выходит за пределы, за исключением индексаторов срезов, которые допускают индексацию за пределами границ. (это соответствует семантике фрагмента python/numpy). Допустимые входы:

Inte целое число, например, 5

List Список или массив целых чисел [4, 3, 0]

Object Объект среза с целыми 1:7

Boo логический массив

Вызываемая функция с одним аргументом (вызывающий Series, DataFrame или Panel), которая возвращает действительный вывод для индексации (один из приведенных выше)

Вы также можете использовать range с concatenate от numpy и получить столбцы, где np.concatenate используется для объединения двух разных диапазонов:

import numpy as np
df = df[df.columns[np.concatenate([range(0,3),range(4,6)])]]
df

Выход:

   Col1     Col2    Col3    Col5    Col6
0     1    apple  tomato  banana  banana
1     1    apple   grape  banana  banana
2     1    apple     NaN  banana  banana
3     1    apple  tomato  banana  banana
4     1    apple  tomato  banana  banana
5     1    apple  tomato  banana  banana
6     1  avacado  tomato  banana  banana
7     1    toast  tomato  banana  banana
8     1    grape  tomato  banana  banana

ОП лицо ошибки от df.columns[0:2,4:5] где слишком много индексов были введены в. IIUC, вы можете собрать все имена столбцов, которые вам нужны, чтобы сделать выбор.

from itertools import chain
cols_to_select = list(v for v in chain(df.columns[0:2], df.columns[4:5]))
df_filtered = df[cols_to_select]

Если в cols_to_select могут быть конфликты имен, сделайте выбор, используя iloc как предложено jp_data_analysis или np.r_ как предложил Вэнь Цзябао.

Используйте метод Pandas iloc:

df_filtered = df.iloc[:, [1,2,3,5,6]]
Другие вопросы по тегам