从MYSQL导入数据后,TypeError:不可散列的类型:'numpy.ndarray'与熊猫

时间:2019-01-20 10:34:48

标签: python mysql pandas numpy matplotlib

我在两个不同的数据源(一个CSV文件和MYSQL数据库)上运行了相同的程序,CSV导入运行良好,但是MYSQL导入引发了numpy类型错误:

我想问题可能在于这2点: 1.数据导入问题-INT,TEXT等?我正在使用VARCHAR作为数据。 2. matplotlib如何与Panda数据框一起使用的问题?

我是新来的,所以请把我当成一个:)

import pandas as pd
import numpy as np
import matplotlib.pyplot as pp
import seaborn
from sqlalchemy import create_engine
import pymysql

engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/babynames",echo=False)

names = pd.read_sql_query('select * from BABYNAMES',engine)

names_indexed = names.set_index(['gender','name','year']).sort_index()


def plotname(gender, name):
    data = names_indexed.loc[gender, name]
    pp.plot(data.index, data.values)

plotname('F','Nancy')

错误代码:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-9d981bcf8365> in <module>()
----> 1 plotname('F','Nancy')

<ipython-input-31-85c728659ad0> in plotname(gender, name)
      1 def plotname(gender, name):
      2     data = allyears_indexed.loc[gender, name]
----> 3     pp.plot(data.index, data.values)

~/anaconda3/lib/python3.7/site-packages/matplotlib/pyplot.py in plot(*args, **kwargs)
   3361                       mplDeprecation)
   3362     try:
-> 3363         ret = ax.plot(*args, **kwargs)
   3364     finally:
   3365         ax._hold = washold

~/anaconda3/lib/python3.7/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1865                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1866                         RuntimeWarning, stacklevel=2)
-> 1867             return func(ax, *args, **kwargs)
   1868 
   1869         inner.__doc__ = _add_data_doc(inner.__doc__,

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_axes.py in plot(self, *args, **kwargs)
   1526         kwargs = cbook.normalize_kwargs(kwargs, _alias_map)
   1527 
-> 1528         for line in self._get_lines(*args, **kwargs):
   1529             self.add_line(line)
   1530             lines.append(line)

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _grab_next_args(self, *args, **kwargs)
    404                 this += args[0],
    405                 args = args[1:]
--> 406             for seg in self._plot_args(this, kwargs):
    407                 yield seg
    408 

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
    381             x, y = index_of(tup[-1])
    382 
--> 383         x, y = self._xy_from_xy(x, y)
    384 
    385         if self.command == 'plot':

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _xy_from_xy(self, x, y)
    214         if self.axes.xaxis is not None and self.axes.yaxis is not None:
    215             bx = self.axes.xaxis.update_units(x)
--> 216             by = self.axes.yaxis.update_units(y)
    217 
    218             if self.command != 'plot':

~/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py in update_units(self, data)
   1467         neednew = self.converter != converter
   1468         self.converter = converter
-> 1469         default = self.converter.default_units(data, self)
   1470         if default is not None and self.units is None:
   1471             self.set_units(default)

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in default_units(data, axis)
    113         # default_units->axis_info->convert
    114         if axis.units is None:
--> 115             axis.set_units(UnitData(data))
    116         else:
    117             axis.units.update(data)

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in __init__(self, data)
    180         self._counter = itertools.count(start=0)
    181         if data is not None:
--> 182             self.update(data)
    183 
    184     def update(self, data):

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in update(self, data)
    197         data = np.atleast_1d(np.array(data, dtype=object))
    198 
--> 199         for val in OrderedDict.fromkeys(data):
    200             if not isinstance(val, VALID_TYPES):
    201                 raise TypeError("{val!r} is not a string".format(val=val))

TypeError: unhashable type: 'numpy.ndarray'

1 个答案:

答案 0 :(得分:0)

我是对的,问题出在数据类型上。我创建了一个新表,将VARCHAR替换为INT,然后使用上面的相同代码,该程序运行良好。