#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