[python]统计excel表格某列中每项出现的次数并画柱状图 |
您所在的位置:网站首页 › python绘制excel数据 › [python]统计excel表格某列中每项出现的次数并画柱状图 |
一.需求:
需要统计该列中每个院系的总数并画成柱状图 删掉前面没有有用数据的几行(空行和"学院"行),第一个单元格删三次相当于删掉了前三行 for i in range(3): del xls_sheet1[0][0] # 删掉前3行三个表格一起做,代码为: # 2017年 xls_file17 = xl.open_workbook("I:/hxy/2017名单.xls") xls_sheet1 = [] table_names17 = xls_file17.sheet_names() xls_sheet1.append(xls_file17.sheets()[0].col_values(1)) # 取院系那一列 for i in range(3): del xls_sheet1[0][0] # 删掉前3行 # 2018年 xls_file18 = xl.open_workbook("I:/hxy/2018年名单.xls") xls_sheet2 = [] xls_sheet2.append(xls_file18.sheets()[0].col_values(1)) # 取院系那一列 # print(xls_sheet2) for i in range(3): del xls_sheet2[0][0] # 删掉前3行 # 2019年 xls_file19 = xl.open_workbook("I:/hxy/2019年名单.xls") xls_sheet3 = [] xls_sheet3.append(xls_file19.sheets()[0].col_values(1)) # 取院系那一列 for i in range(3): del xls_sheet3[0][0] # 删掉前3行 4.拼接三个表格 xls_sheet1.extend(xls_sheet2) xls_sheet1.extend(xls_sheet3) 5.统计 arr = np.array(xls_sheet1) # 转换成array key = np.unique(xls_sheet1) # x轴,得到的也是array对象 result = {} for k in key: mask = (arr == k) arr_new = arr[mask] v = arr_new.size result[k] = v #result是类似于这样的字典:{外语学院:15,文学院:23.....} x = list(result.key()) # 取院系的那一列 y = list(result.values()) # 取数字的那一列 5.画图 plt.bar(x, y, align='center') # 画图,设置x,y轴的数据 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 for x, y in zip(x, y): plt.text(x, y+0.05, '%.0f'%y, ha='center', va='bottom') plt.xticks(rotation =90)# rotation设置x轴标签的旋转度数 plt.show()结果图: 这是用来在柱状图上面显示数值的 参数的意义: x代表代表了不同柱子在图形中的位置(坐标),通过for循环找到每一个x、y值的相应坐标,再使用plt.text在对应位置添文字说明来生成相应的数字标签,而for循环也保证了每一个柱子都有标签。x, y+0.05表示在每一柱子对应x值、y值上方0.05处标注文字说明,’%.0f’ % y,代表标注的文字,即每个柱子对应的y值,其中0表示不显示小数后面的数值,1就表示显示小数后面一位,以此类推; ha=‘center’, va= 'bottom’代表对齐的方式 条形图、折线图也是如此设置,饼图则在pie命令中有数据标签的对应参数。对于累积柱状图、双轴柱状图则需要用两个for循环,同时通过x与y的不同加减来设置数据标签位置。 该解释来自于:https://www.cnblogs.com/charliedaifu/p/9964095.html plt.xticks(rotation =90)#设置坐标轴的标签,rotation设置x轴标签的旋转度数(不旋转的话不够宽,显示不下) 6.想把坐标轴的文字变成竖排好像python做不到,我是通过转成表格再用excel画图的 6.1代码: pf = pd.DataFrame(list(result.keys()), columns=['院系'])# 第一列 pf = pd.concat([pf,pd.DataFrame(list(result.values()), columns=['计数'])], axis=1) #第二列拼接 ''' #也可以用这个转换 pf=pd.DataFrame(list(result.items()), columns=['院系', '计数']) ''' file_path = pd.ExcelWriter('I:/hxy/result.xlsx') pf.to_excel(file_path, encoding='utf-8', index=False)# 输出为表格 file_path.save()# 保存表格 6.2excel中的操作: 1.选择A2:B35这两列有效的得到表格后选择坐标轴–>更多选项 在数据标签那里打勾 https://blog.csdn.net/oh5w6hinug43jvrhhb/article/details/90152959 1.将列表变成DataFrame形式,使用pd.concat进行合并 https://blog.csdn.net/u013385362/article/details/78444518 内容: https://blog.csdn.net/tanlangqie/article/details/80874866 from pandas.core.frame import DataFrame a=[1,2,3,4]#列表a b=[5,6,7,8]#列表b c={"a" : a, "b" : b}#将列表a,b转换成字典 data=DataFrame(c)#将字典转换成为数据框 print(data)这里的a,b都被当成列了 可以子列表先当成行,再转置 from pandas.core.frame import DataFrame a=[[1,2,3,4],[5,6,7,8]]#包含两个不同的子列表[1,2,3,4]和[5,6,7,8] data=DataFrame(a)#这时候是以行为标准写入的 print(data)结果: 0 1 2 3 0 1 2 3 4 1 5 6 7 8转置: data=data.T#转置之后得到想要的结果 data.rename(columns={0:'a',1:'b'},inplace=True)#注意这里0和1都不是字符串 print(data)结果: a b 0 1 5 1 2 6 2 3 7 3 4 83.用pd的方法直接将字典列表转换为DataFrame https://www.cnblogs.com/zhengxt-520/p/11446121.html
https://blog.csdn.net/htbeker/article/details/85053308 5.列表转字典 https://blog.csdn.net/loner_fang/article/details/80940600 https://blog.csdn.net/qq_42467563/article/details/86182266 https://blog.csdn.net/sunshine__0411/article/details/80792970 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |