Объединение iloc и loc

#python #pandas

#python #панды

Вопрос:

Я пытаюсь объединить iloc и loc, есть ли такая возможность?

В частности, я хотел бы:

  • укажите целое число в форме (:train_size) для значений строк

  • предоставьте список с именами столбцов для значений столбцов (заменив [0,1] в приведенном ниже коде)

    training_set = dataset.iloc[:train_size,[0,1]].значения

пытаюсь

 training_set = dataset.loc[:train_size,[list_input_and_y_parameters]].values
  

выдает сообщение об ошибке

Ошибка типа: невозможно выполнить индексацию фрагмента с помощью этих индексаторов [4275] из

Есть ли способ сделать это?

Большое спасибо

Комментарии:

1. Я считаю, что нам нужно больше информации, чтобы утверждать это с ясностью. Например, нам нужно знать, как вы dataset выглядите, каковы столбцы и индексы?

Ответ №1:

Вы можете выполнить эту операцию по цепочке или использовать только iloc с Index.get_indexer для позиций столбцов в списке:

 training_set = dataset.iloc[:train_size].loc[:, ['col1','col2']].values
  

 training_set = dataset.iloc[:train_size, df.columns.get_indexer(['col1','col2'])].values
  

Комментарии:

1. Я думаю, что использование Index.get_indexer — лучший вариант, потому что он также работает с присваиванием

2. Вы знаете, считается ли правильным использовать цепную индексацию для первого примера? Документация не поощряет цепную индексацию, такую как dfmi[‘one’][‘second’], но она не распространяется на цепочки loc. pandas.pydata.org/pandas-docs/stable/user_guide /…

3. @etotheipi При использовании связанных loc я получаю такое же предупреждение, поэтому я предполагаю, что это неправильный способ сделать это.

4. @Garnagar — можешь попробовать training_set = dataset.iloc[:train_size].loc[:, ['col1','col2']].copy() ?

5. Какому ужасно запутанному методу нам нужно следовать, чтобы сделать что-то такое простое, как df[0, 'col'] = 10 работа! Pandas действительно нужно упростить присвоение определенной строке (по индексу) и определенному столбцу (по имени)

Ответ №2:

Как может вызвать объединение в цепочку loc и iloc SettingWithCopyWarning , Index.get_indexer может быть (при условии, что в индексе нет дубликатов) опция без необходимости использования:

 training_set = dataset.loc[dataset.index[:train_size], ['col1','col2']].values