Замена значений в столбце для подмножества строк

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня dataframe есть несколько столбцов. Я хотел бы заменить значение в вызываемом столбце Discriminant . Теперь это значение нужно заменять только для нескольких строк, всякий раз, когда выполняется условие в другом вызываемом столбце ids . Я пробовал различные методы; Наиболее распространенным методом, по-видимому, является использование .loc метода, но по какой-то причине он не работает для меня.

Вот варианты, которые я безуспешно пытаюсь:

encodedid — переменная, используемая для проверки условий

indices — переменная, используемая для подмножества dataframe (начинается с нуля)

Вариант 1:

 df[df.ids == encodedid].loc[df.ids==encodedid, 'Discriminant'].values[indices] = 'Y'
  

Вариант 2:

 df[df['ids'] == encodedid].iloc[indices,:].set_value('questionid','Discriminant', 'Y')
  

Вариант 3:

 df.loc[df.ids==encodedid, 'Discriminant'][indices] = 'Y'
  

Variation 3 особенно разочаровывает то, что большинство сообщений на SO, как правило, говорят, что это должно работать, но это дает мне следующую ошибку:

 ValueError: [ 0  1  2  3  5  6  7  8 10 11 12 13 14 16 17 18 19 20 21 22 23] not contained in the index
  

Любые указатели будут высоко оценены.

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

1. что такое индексы? вы можете распечатать это? не уверен, чего вы пытаетесь достичь, также покажите нам мелкий шрифт вашего df

Ответ №1:

вы слишком много сокращаете. попробуйте что-то вроде этого:

 indexer = df[df.ids == encodedid].index
df.loc[indexer, 'Discriminant'] = 'Y'
  

.loc[] требуется список индексов и список столбцов. вы можете легко установить значение этого фрагмента, используя = «то, что вам нужно»

глядя на вашу проблему, вы можете захотеть установить, что для 2 столбцов одновременно имеет:

 indexer = df[df.ids == encodedid].index
column_list = ['Discriminant', 'questionid']

df.loc[indexer, column_list] = 'Y'
  

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

1. добавлен пример для 2 столбцов одновременно

2. IMO df.loc[(df.ids == encodedid), 'Discriminant'] = 'Y' (if "encodedid" is a scalar value) or df.loc[df.ids.isin(encodedid), ‘Discriminant’] = ‘Y» (если «encodedid» является списком) должно быть достаточно

3. @Patthebug, можете ли вы опубликовать воспроизводимый образец и нужные наборы данных (5 строк для каждого должно быть достаточно)? И что это encodedid — список или скалярное значение?

Ответ №2:

Может быть, что-то вроде этого. У меня нет фрейма данных для его тестирования, но…

 df['Discriminant'] = np.where(df['ids'] == 'some_condition', 'replace', df['Discriminant'])