2017-01-05 9 views
1

Я экспериментирую с методом iloc. Согласно документации, логический массив является допустимым вводом.Вызов iloc() с булевым массивом

Как я понимаю, это то, что если у меня есть логический массив idx со значениями F, T, T, T и I передаю его как вход следующим образом: df.iloc (:, idx), то я получу 2-й, 3-й и 4-й столбцы df (предположим, что df имеет 4 столбца).

Я попытался реализовать это, но я столкнулся с ошибками.

В качестве примера у меня есть dataframe ф.р.

  col1 col2 col3 col4 
     0  1  2  3  4 
     1  5  6  7  8 

У меня также есть панды булевой Серия:

 idx = pd.Series(['False', 'True', 'True', 'True']) 

преобразовать булеву серию к логическому np.array:

idx = idx.values 

Затем передаю его на листок

df.iloc[: , idx] 

Я получаю сообщение об ошибке:

IndexError: positional indexers are out-of-bounds 

, которые я не понимаю, так как dataframe 4 колонки и я прохожу 4 булевы значения.

Ваша помощь будет оценена по достоинству.

+0

изменить значения строк в 'idx' с помощью логических значений:' pd.Series ([False, True, True, True]) ' – enneppi

ответ

1

Ваша проблема в том, что вы передаете iloc ряд строк, а не ряд булевых. Вы не создали логический массив и вместо этого создали серию строк со значениями «True» и «False».

Изменить этот

idx = pd.Series(['False', 'True', 'True', 'True']) 

Для этого

idx = pd.Series([False, True, True, True]) 

И вы также должны использовать значение серии вы создали, как я получаю ошибку NotImplemented с df.iloc[:, idx]

Так используйте это вместо:

df.iloc[:, idx.values] 
+1

Точнее -' df.iloc [:, pd.eval (idx)] ' –

+0

Отлично! Согласно документации метод values ​​() преобразует серию в массив np. Поскольку документация указывает, что мы должны передать в качестве входного логического массива, имеет смысл преобразовать idx в np.array и передать его как idx.values. Я попробовал и работал. Почему Никиль говорит, что нам нужно вместо pd.eval (idx)? – im7