Вопрос или проблема
Я пытаюсь построить дентрограмму для кластеризации данных, но эта ошибка мешает мне. Мои данные здесь.
Сначала я выбрал столбцы для работы:
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()
Пояснения
-
Преобразование в список: Мы используем
tolist()
, чтобы преобразоватьcountry_names
из Series в список. Это устраняет двусмысленность и позволяет функцииdendrogram
корректно интерпретировать метки. -
Параметры для
dendrogram
: Параметрыleaf_rotation
иleaf_font_size
помогут вам лучше визуализировать дендрограмму.
Теперь, после внесенных изменений, код должен работать без ошибок, и дендрограмма будет корректно отображать названия стран, что значительно улучшит восприятие данных.
Если у вас возникнут дополнительные вопросы или потребуется помощь, пожалуйста, не стесняйтесь спрашивать.