TypeError: unhashable type: 'numpy.ndarray' при попытке создать точечный график из набора данных - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь создать точечный график, используя набор данных для фильмов. Цель состоит в том, чтобы посмотреть на корреляцию между различными категориями и целевой переменной, независимо от того, выиграл фильм или нет. Я попытался выполнить вызов типа для моих переменных, и ни одна из них, по-видимому, не относится к типу numpy.ndarray, так как они оба являются информационными кадрами pandas, но я все еще получаю следующую ошибку, когда пытаюсь создать точечный график:

TypeError: unhashable тип: 'numpy.ndarray'

Мой код выглядит следующим образом:

import pandas as pd
import matplotlib.pyplot as plt

file=pd.read_csv('academy_awards.csv',sep=',',error_bad_lines=False,encoding="ISO 8859-1")
print(file)
df=pd.DataFrame(file)

#df=df.dropna(axis=0,how='any')
target=df.Category
X=pd.DataFrame(df.Won)

y=target
#print(type(X))
#print(type(y))

plt.scatter(X,y)

Ниже приведены первые 5 строк набора данных, который я использую:

Year,Category,Nominee,Additional Info,Won
2010 (83rd),Actor -- Leading Role,Javier Bardem,Biutiful 
{'Uxbal'},NO
2010 (83rd),Actor -- Leading Role,Jeff Bridges,True Grit {'Rooster 
Cogburn'},NO
2010 (83rd),Actor -- Leading Role,Jesse Eisenberg,The Social 
Network {'Mark Zuckerberg'},NO
2010 (83rd),Actor -- Leading Role,Colin Firth,The King's Speech 
{'King George VI'},YES
2010 (83rd),Actor -- Leading Role,James Franco,127 Hours {'Aron 
Ralston'},NO
2010 (83rd),Actor -- Supporting Role,Christian Bale,The Fighter 
{'Dicky Eklund'},YES

Любая помощь или предложения с благодарностью!

Edit: Ниже приводится полный трекбек -

-----------------------------------------------------------------------
TypeError                                 Traceback (most recent call 
last)
<ipython-input-211-efcb7c41bca1> in <module>
     14 print(y.shape)
     15 
---> 16 plt.scatter(X,y)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/pyplot.py in scatter(x, y, s, c, marker, cmap, 
norm, vmin, vmax, alpha, linewidths, verts, edgecolors, data, **kwargs)
   2862         vmin=vmin, vmax=vmax, alpha=alpha, 
linewidths=linewidths,
   2863         verts=verts, edgecolors=edgecolors, **({"data": data} 
if data
-> 2864         is not None else {}), **kwargs)
   2865     sci(__ret)
   2866     return __ret

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/__init__.py in inner(ax, data, *args, **kwargs)
   1808                         "the Matplotlib list!)" % (label_namer, 
func.__name__),
   1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
   1811 
   1812         inner.__doc__ = _add_data_doc(inner.__doc__,

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, 
cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   4170             edgecolors = 'face'
   4171 
-> 4172         self._process_unit_info(xdata=x, ydata=y, 
kwargs=kwargs)
   4173         x = self.convert_xunits(x)
   4174         y = self.convert_yunits(y)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/axes/_base.py in _process_unit_info(self, xdata, 
ydata, kwargs)
   2133             return kwargs
   2134 
-> 2135         kwargs = _process_single_axis(xdata, self.xaxis, 
'xunits', kwargs)
   2136         kwargs = _process_single_axis(ydata, self.yaxis, 
'yunits', kwargs)
   2137         return kwargs

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/axes/_base.py in _process_single_axis(data, axis, 
unit_name, kwargs)
   2116                 # We only need to update if there is nothing 
set yet.
   2117                 if not axis.have_units():
-> 2118                     axis.update_units(data)
   2119 
   2120             # Check for units in the kwargs, and if present 
update axis

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/axis.py in update_units(self, data)
   1471         neednew = self.converter != converter
   1472         self.converter = converter
-> 1473         default = self.converter.default_units(data, self)
   1474         if default is not None and self.units is None:
   1475             self.set_units(default)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/category.py in default_units(data, axis)
    101         # default_units->axis_info->convert
    102         if axis.units is None:
--> 103             axis.set_units(UnitData(data))
    104         else:
    105             axis.units.update(data)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/category.py in __init__(self, data)
    167         self._counter = itertools.count()
    168         if data is not None:
--> 169             self.update(data)
    170 
    171     def update(self, data):

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site- 
packages/matplotlib/category.py in update(self, data)
    184         data = np.atleast_1d(np.array(data, dtype=object))
    185 
--> 186         for val in OrderedDict.fromkeys(data):
    187             if not isinstance(val, (str, bytes)):
    188                 raise TypeError("{val!r} is not a 
string".format(val=val))

TypeError: unhashable type: 'numpy.ndarray'

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Массивы не подлежат изменению, потому что они изменчивы.Вы можете хэшировать его, конвертируя его в неизменяемый кортеж (оборачивая его tuple()), но обычно вам все равно не следует пытаться хэшировать массивы.Ваши данные, вероятно, имеют неправильную форму.

0 голосов
/ 02 мая 2019

Во-первых, вам не нужно: df=pd.DataFrame(file). После открытия CSV-файла с пандами и сохранения его в переменной file вы уже получаете данные в виде dataFrame.

Затем вы можете легко вызвать scatter и выбрать ось X и Y с помощью

df.plot(kind ="scatter", x= "Won", y = "Category")

Вам не нужно предварительно обрабатывать данные, потому что они уже предварительно обработаны после открытия файла пандами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...