Как исправить эту строку кода, которая обнаруживает ошибку «не удается назначить вызов функции»?

#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