#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'])