#pandas #dataframe #valueerror
#pandas #фрейм данных #ошибка значения
Вопрос:
Я пытаюсь написать функцию, которая генерирует гистограмму с учетом столбца PD и списка меток для легенды. У меня есть категориальные данные, которые были численно закодированы, поэтому метки по умолчанию — это просто числа, которые я хочу изменить обратно на строковые значения. Вот мой код:
legend_labels = ["label 1", "label 2"]
def plot_percentages(col, legend_labels):
plt.figure(figsize=(7,6))
ax = sns.barplot(x="x", y="x", hue=col, data=df,
estimator=lambda x: len(x) / len(df) * 100)
ax.set(ylabel="Percentage")
plt.xticks([0, 1], ['A', "B"])
L=plt.legend()
for idx, val in pd.DataFrame(legend_labels).iterrows():
L.get_texts()[idx].set_text(val)
ax
Он возвращает следующую ошибку:
Ошибка значения: значение истинности ряда неоднозначно. Используйте .empty , .bool(),.item(), .any() или.all().
Заранее спасибо за любые предложения о том, как это исправить.
Комментарии:
1. Почему вы преобразуете список в df только для того, чтобы перебирать его? Просто возьмите метки из списка напрямую.
2. Потому что тогда я получаю «AttributeError: объект ‘list’ не имеет атрибута ‘iterrows'». Изменение этого атрибута выдает ошибку «Ошибка значения: слишком много значений для распаковки (ожидается 2)». Мне нужно извлечь как элемент списка, так и его позицию в списке, но я не уверен, как это сделать, не преобразовав его сначала в df.
3. Но зачем вообще использовать iterrows()?
for val in legend_labels:
работает просто отлично. Или, если вам нужен idx, тогдаfor idx, val in enumerate(legend_labels):
4. Да, enumerate() — это то, что я искал. Спасибо!
5. Я добавил в качестве ответа. Оставьте комментарий, если все еще возникают проблемы
Ответ №1:
Решение состоит в том, чтобы не использовать iterows()
здесь, а просто простой цикл for .
for idx, val in enumerate(legend_labels):
L.get_texts()[idx].set_text(val)