我想运用matplotlib包,为我的数据绘制直方图。这里会出现两个错误。
为了索引方便,先放上主要的报错信息:
error1:A value is trying to be set on a copy of a slice from a DataFrame.
error2:module 'matplotlib' has no attribute 'show'
代码如下:
data = pd.read_table("%s\\adult.data" %path,delimiter=',',engine='python') #读取数据
cols = ['age', 'education_num', 'capital_gain', 'capital_loss', 'hours_per_week', 'label']
data = data3[cols] #保留指定的列
data['label_code'] = pd.Categorical(data.label).codes #注意!这条命令出现错误。
最后一条命令的错误信息如下:
A value is trying to be set on a copy of a slice from a DataFrame.
查找相关资料发现,错误的原因为操作的数据不是原始数据,而是原始数据的视图。,因此无法进行这一项修改工作。
在操作之前,应该先将数据进行复制,之后便可以进行操作了。(具体的原理还是不太懂。。。)
代码如下:
data = pd.read_table("%s\\adult.data" %path,delimiter=',',engine='python') #读取数据
cols = ['age', 'education_num', 'capital_gain', 'capital_loss', 'hours_per_week', 'label']
data = data[cols] #保留指定的列
data1 = data.copy()
data1['label_code'] = pd.Categorical(data1.label).codes
这样就不会报错,可以对数据进行修改了。
接下来,我要导入matplotlib包,绘制直方图。
data = pd.read_table("%s\\adult.data" %path,delimiter=',',engine='python') #读取数据
cols = ['age', 'education_num', 'capital_gain', 'capital_loss', 'hours_per_week', 'label']
data = data[cols] #保留指定的列
data1 = data.copy()
data1['label_code'] = pd.Categorical(data1.label).codes
import matplotlib as plt
data1[['age','hours_per_week', 'education_num', 'label_code',]].hist()
plt.show() #注意!这条命令出现错误。
最后一条命令的错误信息为:
module 'matplotlib' has no attribute 'show'
有一点匪夷所思,因为平时调用matplotlib也是这么操作的,为什么这次会出错呢?
通过查找资料,发现plt是pyplot的缩写,之前pylab将pyplot整合进了matplotlib,作为其的一个模块。在使用pyplot包的具体功能时,为了不出现可能的错误,最好将其名称区分开来。
具体的,正确的代码为:
data = pd.read_table("%s\\adult.data" %path,delimiter=',',engine='python') #读取数据
cols = ['age', 'education_num', 'capital_gain', 'capital_loss', 'hours_per_week', 'label']
data = data[cols] #保留指定的列
data1 = data.copy()
data1['label_code'] = pd.Categorical(data1.label).codes
import matplotlib.pyplot as plt
data1[['age','hours_per_week', 'education_num', 'label_code',]].hist()
plt.show()
代码运行正确,Python输出了我想要的直方图: