Дендограмма: ValueError: Истинностное значение серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all()

Вопрос или проблема

Я пытаюсь построить дентрограмму для кластеризации данных, но эта ошибка мешает мне. Мои данные здесь.

Сначала я выбрал столбцы для работы:

    df_euro = pd.read_csv('https://assets.datacamp.com/production/repositories/655/datasets/2a1f3ab7bcc76eef1b8e1eb29afbd54c4ebf86f2/eurovision-2016.csv')
   samples = df_euro.iloc[:, 2:7].values[:42]
   country_names = df_euro.iloc[:, 1].values[:42]
            
        # Расчет связи: объединения
            mergings = linkage(samples , method = 'complete')
            # Построение дентрограммы
            dendrogram(
                mergings,
                labels = y,
                leaf_rotation = 90,
                leaf_font_size = 6
            )
            plt.show()

Но я получаю эту ошибку, которую не могу понять. Я гуглил это и проверил, что обе имеют одинаковую форму (1066,5) и (1066,). В обеих функциях нет NA и country_names.

Я знаю, что проблема в метках, потому что все работает хорошо, когда я их убираю, но я не смог найти способ ее решить. Любая помощь будет очень ценна. Альтернативно, как я могу добавить метки к дентрограмме?

Ошибка, которую я получаю:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-113-7fffdc847e5e> in <module>
      4 mergings = linkage(feat, method = 'complete')
      5 # Построение дентрограммы
----> 6 dendrogram(
      7     mergings,
      8     labels = target_col,

C:\ProgramData\Anaconda3\lib\site-packages\scipy\cluster\hierarchy.py in dendrogram(Z, p, truncate_mode, color_threshold, get_leaves, orientation, labels, count_sort, distance_sort, show_leaf_counts, no_plot, no_labels, leaf_font_size, leaf_rotation, leaf_label_func, show_contracted, link_color_func, ax, above_threshold_color)
   3275                          "'bottom', or 'right'")
   3276 

-> 3277     if labels and Z.shape[0] + 1 != len(labels):
   3278         raise ValueError("Размеры Z и labels должны быть согласованы.")
   3279 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1476 
   1477     def __nonzero__(self):
-> 1478         raise ValueError(
   1479             f"Истинное значение {type(self).__name__} неоднозначно. "
   1480             "Используйте a.empty, a.bool(), a.item(), a.any() или a.all()."

ValueError: Истинное значение Series неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().

На случай, если кто-то другой ищет ту же проблему, преобразование меток в список решает вопрос.

samples= df_euro.iloc[:, 2:7].values[:42]
country_names= list(df_euro.iloc[:, 1].values[:42])

mergings = linkage(samples, method='single')

# Построение дентрограммы
fig, ax = plt.subplots(figsize=(15, 10))
fig  = dendrogram(mergings, labels=country_names)
plt.show()

Ответ или решение

Ошибка, с которой вы столкнулись, связана с тем, что вы передаете в функцию dendrogram некорректный формат для аргумента labels. Давайте подробно разберем вашу проблему и предложим правильное решение.

Проблема

Вы пытаетесь построить дендрограмму на основе данных, которые вы загружаете из CSV-файла. Ошибка, с которой вы столкнулись, звучит следующим образом:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Эта ошибка возникает, когда вы передаете в функцию dendrogram объект Series из библиотеки pandas в качестве аргумента labels, и код не может определить, как с ним работать, поскольку он имеет неопределённую истинность.

Причина ошибки

В вашем коде строка labels = y (где y — ваш объект Series), приводит к возникновению этой ошибки. Когда вы указываете массив данных, распечатанный в виде Series, он не интерпретируется правильно как одномерный массив, который ожидается функцией dendrogram.

Решение

Для решения проблемы необходимо преобразовать labels в обычный список, чтобы устранить двусмысленность, с которой функция dendrogram не может справиться.

Вот исправленный код:

import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# Загружаем данные
df_euro = pd.read_csv('https://assets.datacamp.com/production/repositories/655/datasets/2a1f3ab7bcc76eef1b8e1eb29afbd54c4ebf86f2/eurovision-2016.csv')

# Выбираем образцы и названия стран
samples = df_euro.iloc[:, 2:7].values[:42]
country_names = df_euro.iloc[:, 1].values[:42].tolist()  # Преобразуем в список

# Вычисляем связь
mergings = linkage(samples, method='complete')

# Строим дендрограмму
plt.figure(figsize=(15, 10))
dendrogram(
    mergings,
    labels=country_names,
    leaf_rotation=90,
    leaf_font_size=6
)
plt.show()

Пояснения

  1. Преобразование в список: Мы используем tolist(), чтобы преобразовать country_names из Series в список. Это устраняет двусмысленность и позволяет функции dendrogram корректно интерпретировать метки.

  2. Параметры для dendrogram: Параметры leaf_rotation и leaf_font_size помогут вам лучше визуализировать дендрограмму.

Теперь, после внесенных изменений, код должен работать без ошибок, и дендрограмма будет корректно отображать названия стран, что значительно улучшит восприятие данных.

Если у вас возникнут дополнительные вопросы или потребуется помощь, пожалуйста, не стесняйтесь спрашивать.

Оцените материал
Добавить комментарий

Капча загружается...