#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я сталкиваюсь с ошибкой «не удается назначить вызов функции» при запуске этой строки:
df_temp = pd.DataFrame({'input' : np.random.randint(0, 10, 100), 'output' : np.random.randint(0, 10, 100)})
df_temp.loc[(df_temp['input'] > 4) amp; (df_temp['output'] == 4), df_temp['output'].shift()] = -1
Что я пытаюсь сделать, так это присвоить значение -1
сдвинутой позиции столбца output
на основе условий столбцов input > 4
и output == 4
Комментарии:
1. Средство доступа ожидает
DataFrame.loc[<rows>, <columns>]
, но вы предоставилиDataFrame.loc[<rows>, <more rows>]
2. Спасибо. Можете ли вы предложить, как это исправить?
3. Я создаю отдельный столбец сдвига, который работает, но есть дополнительные шаги. Есть ли более эффективный способ сделать это?
4. что определяет efficient в вашем случае? меньше строк кода? более короткое время выполнения?
Ответ №1:
Попробуйте:
df_temp = pd.DataFrame({'input' : np.random.randint(0, 10, 100), 'output' : np.random.randint(0, 10, 100)})
first_val = df_temp.loc[df_temp.index[0], 'output']
df_temp.loc[(df_temp['input'] > 4) amp; (df_temp['output'] == 4), 'output'] = -1
df_temp.loc[df_temp.index[0], 'output'] = first_val
Речь .loc[index_filter, col_filter]
col_filter
идет не о pd.Series
том, что это либо одна строка для обозначения одного столбца, либо список строк для обозначения нескольких столбцов.
Если вы хотите эмулировать поведение сдвига и в то же время использовать логическую индексацию — просто сохраните на стороне любой сдвиг, который вы хотите, перезапишите все, затем замените обратно ту часть, которую вы хотите сохранить с помощью shift