有人知道如何处理这个错误吗?TypeError:不可散列的类型:‘numpy.ndarray’

rqqzpn5f  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(464)

我们从班上得到了以下指示:

看起来,其他人都可以做,但没有提到其他步骤,我做错了什么?

import pandas as pd
import numpy as np
house1 = pd.read_csv("House1.csv")
house1.set_index('tstp', drop=True, inplace=True)

# replace 'Null' String with proper built-in NaN

house1.replace('Null', np.nan, inplace=True)

either: 
house1.dropna(axis=0, inplace=True) 
house1.dropna(axis=1, inplace=True)

or 
house1.fillna(42, inplace=True) #guess

# replace NaN with last valid entry in the column

house1.fillna(method='ffill', inplace=True)

# Or fill with mean or median

plt.plot(house1, label="Original") #Here I get the error.

我在网上搜索了一下,发现有问题,我需要先转换一下,...问题:我不知道怎么做。有谁有主意吗?一如既往的感谢!

rqdpfwrv

rqdpfwrv1#

有几种方法可以解决这个问题,评论中已经提出了这些方法:

选项一

指定plt.plotxy参数:

plt.plot(x=house1['SOME_COL'], y=house1['SOME_OTHER_COL'], label="Original")
plt.show()

# Or:

plt.plot('SOME_COL', 'SOME_OTHER_COL', data=house1, label="Original")
plt.show()

例如

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

house1 = pd.DataFrame({'tstp': [1, 2, 3, 4], 'a': ['a', 'Null', 'b', 'a'], 'b': [10, 10, 20, 30]})
house1.set_index('tstp', drop=True, inplace=True)
house1.replace('Null', np.nan, inplace=True)
house1.dropna(axis=0, inplace=True) 
house1.dropna(axis=1, inplace=True)

plt.plot(house1['a'], house1['b'], label="Original")
plt.show()

输出:

如果我没有指定xy,我将收到与您相同的错误:

plt.plot(house1)

TypeError                                 Traceback (most recent call last)
<ipython-input-56-bd9f7a34c87b> in <module>
----> 1 plt.plot(house1)

7 frames
/usr/local/lib/python3.7/dist-packages/matplotlib/pyplot.py in plot(scalex, scaley, data, *args,**kwargs)
   2761     return gca().plot(
   2762         *args, scalex=scalex, scaley=scaley,**({"data": data} if data
-> 2763         is not None else {}),**kwargs)
   2764 
   2765 

/usr/local/lib/python3.7/dist-packages/matplotlib/axes/_axes.py in plot(self, scalex, scaley, data, *args,**kwargs)
   1645         """
   1646         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D)
-> 1647         lines = [*self._get_lines(*args, data=data,**kwargs)]
   1648         for line in lines:
   1649             self.add_line(line)

/usr/local/lib/python3.7/dist-packages/matplotlib/axes/_base.py in __call__(self, *args,**kwargs)
    214                 this += args[0],
    215                 args = args[1:]
--> 216             yield from self._plot_args(this, kwargs)
    217 
    218     def get_next_color(self):

/usr/local/lib/python3.7/dist-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
    337             self.axes.xaxis.update_units(x)
    338         if self.axes.yaxis is not None:
--> 339             self.axes.yaxis.update_units(y)
    340 
    341         if x.shape[0] != y.shape[0]:

/usr/local/lib/python3.7/dist-packages/matplotlib/axis.py in update_units(self, data)
   1514         neednew = self.converter != converter
   1515         self.converter = converter
-> 1516         default = self.converter.default_units(data, self)
   1517         if default is not None and self.units is None:
   1518             self.set_units(default)

/usr/local/lib/python3.7/dist-packages/matplotlib/category.py in default_units(data, axis)
    105         # the conversion call stack is default_units -> axis_info -> convert
    106         if axis.units is None:
--> 107             axis.set_units(UnitData(data))
    108         else:
    109             axis.units.update(data)

/usr/local/lib/python3.7/dist-packages/matplotlib/category.py in __init__(self, data)
    173         self._counter = itertools.count()
    174         if data is not None:
--> 175             self.update(data)
    176 
    177     @staticmethod

/usr/local/lib/python3.7/dist-packages/matplotlib/category.py in update(self, data)
    208         # check if convertible to number:
    209         convertible = True
--> 210         for val in OrderedDict.fromkeys(data):
    211             # OrderedDict just iterates over unique values in data.
    212             cbook._check_isinstance((str, bytes), value=val)

TypeError: unhashable type: 'numpy.ndarray'

注意事项

如果 Dataframe 中的所有列都有数值,那么您的代码就可以正常工作了:

house2 = pd.DataFrame({'a': [10, 10, 20, 30], 'b': [10, 10, 20, 30], 'tstp': [1, 2, 3, 4]})
plt.plot(house2)
plt.show()

选项二

使用pandas.DataFrame类附带的plot方法。在尝试绘制数据之前,pandas.DataFrame.plot会过滤掉任何非数字列。

示例

house1.plot()

相关问题