Как исправить ошибку значения с помощью Pandas iterrows

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