1. 折线图
1.1 简单折线图
import matplotlib.pyplot as plt
# 最简单的 plt.plot(y)
# plt.plot([5,3,1,2,8,4,1,9])
# plt.show()
1.2 带有x轴,y轴的折线图
import matplotlib.pyplot as plt
# 有x轴,有y轴
x = ['a','b','c','d','e','f','g','h']
y = [6,4,2,6,3,1,8,3]
plt.plot(x,y)
# 或 plt.plot(['a','b','c','d'],[1,2,3,4])
plt.show()
案例:表示一个商品的价格变化趋势
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 用来显示中文标签
x = ['春','夏','秋','冬']
y = [320,250,580,450]
plt.plot(x,y)
plt.show()
1.3 两条折线图,表示最低温和最高温
import matplotlib.pyplot as plt
# 两条折线的图
plt.rcParams['font.sans-serif']=['SimHei'] # 用来显示中文标签
# 推荐方法: plt.plot(x1,y1) plt.plot(x2,y2) x1是第一个曲线的x轴,y1是第一个曲线的y轴
# x1 = ['3月4','3月5','3月6','3月7','3月8','3月9']
# y1 = [9,6,3,2,1,3]
# y2 = [11,9,9,13,12,13]
# plt.plot(x1,y1)
# plt.plot(x1,y2)
# 或 可以单独设置样式
plt.plot(['3月4','3月5','3月6','3月7','3月8','3月9'],[9,6,3,2,1,3],color='m',linestyle="-.",marker="*")
plt.plot(['3月4','3月5','3月6','3月7','3月8','3月9'],[11,9,9,13,12,13],color='y',linestyle="--",marker="P")
plt.show()
另一种方法:
import matplotlib.pyplot as plt
# 格式 [[],[],[]] ----二维数组的初始画法---会出现意外的结果
data = [[2,1,4,5,3,6],[5,4,7,1,6,8],[6,2,3,4,1,2]]
# 2 1 4 5 3 6
# 5 4 7 1 6 8
# 6 2 3 4 1 2
# 是按照二维数据的列画的
plt.plot(data)
plt.show()
使用转置(T)的方法解决
import matplotlib.pyplot as plt
import numpy as np
data = np.array([[2,1,4,5,3,6],[5,4,7,1,6,8],[6,2,3,4,1,2]])
plt.plot(data.T)
plt.show()
2. 柱形图
bar(x,height,width,bottom,tick_label)
x:横轴的坐标 (必须有的,不能省略)
height:柱子的高度相当于y轴 (必须有的,不能省略)
后面的参数,都是可写可不写的。参数的名字必须写:
width:柱子的宽度,默认值为0.8
bottom:柱子的底
tick_label:柱子横轴的名字
2.1 普通柱形图
import matplotlib.pylab as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
data = [350,280,580,460]
plt.bar(np.arange(1,5),data,tick_label=['春','夏','秋','冬'])
plt.show()
注意:x轴不可省略
有时候,用range替代x轴的文字,用tick_label添加文字
2.2 簇状柱形图
import matplotlib.pylab as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
data = [350,280,580,460]
data2 = [290,420,390,350]
plt.bar(np.arange(1,5)-0.4,data,tick_label=['春','夏','秋','冬'],width=0.4)
plt.bar(np.arange(1,5),data2,tick_label=['春','夏','秋','冬'],width=0.4)
plt.show()
案例
从xlsx导入数据画图
xlsx数据
import matplotlib.pylab as plt
import numpy as np
import pandas as pd
df = pd.read_excel('2-2.xlsx')
x = df['财年']
data1 = df['GMV1']
data2 = df['GMV2']
plt.bar(np.arange(len(df)),data1,tick_label=x,width=0.4)
plt.bar(np.arange(len(df))-0.4,data2,tick_label=x,width=0.4)
plt.show()
2.3 堆积柱形图
从xlsx导入数据
import matplotlib.pylab as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-2.xlsx')
x = df['财年']
data1 = df['GMV1']
data2 = df['GMV2']
plt.bar(x,data1) # 第一个柱子
plt.bar(x,data2,bottom=data1) # 第二个柱子,放在第一个柱子上,bottom的值等于data1
plt.show()
案例
A B两个产品
A产品是羽绒服:春 320 夏 250 秋 580 冬 450
B产品是电风扇:春 280 夏 400 秋 380 冬 320
画堆积柱形图
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
x = ['春','夏','秋','冬']
data1 = [320,250,580,450]
data2 = [280,400,380,320]
plt.bar(x,data1) # 第一个柱子
plt.bar(x,data2,bottom=data1) # 第二个柱子,放在第一个柱子上,bottom的值等于data1
plt.show()
3. 条形图
横向的柱形图:
h -----水平的(horizontal)
v -----垂直的(vertical)
barh(y,windth,height,left,tick_label)
y,width是必须要写的参数
y:是条形图的纵轴,可以是数字序列也可以是分类(春夏秋冬)
相当于柱形图的x轴
width:是条形图中,条的长度(相当于柱形图的y轴),是一个数值
其他是非必写参数,定义的时候一定要加参数名:
height:每个条有多宽(相当于柱形图的width),默认0.8
left:每个条的起点(相当于柱形图的bottom),用于堆积柱形图
tick_label:定义y轴的标签的
3.1 普通条形图
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
x = ['春','夏','秋','冬']
y = [50,130,50,150]
plt.barh(x,y)
plt.show()
案例
import matplotlib.pylab as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-3.xls')
label = df['商品种类']
data = df['替代率']
plt.barh(label,data,height=0.6)
plt.show()
3.2 簇状条形图
import matplotlib.pylab as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
label = ['购物','人情往来','餐饮美食','通信物流','生活用品','交通出行','休闲娱乐']
data1 = [2202,2234,1924,2157,1985,3014,2310]
data2 = [957,1234,1201,784,2147,1423,982]
#簇状条形图
plt.barh(np.arange(1,8),data1,tick_label=label,height=0.4)
plt.barh(np.arange(1,8)-0.4,data2,tick_label=label,height=0.4)
plt.show()
条的宽度height 变成 1/2 y的坐标轴需要定义成numpy序列
两组数据,y值通过+-,让两组条错开显示,实现簇状条形图
3.3 堆积条形图
import matplotlib.pylab as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
label = ['购物','人情往来','餐饮美食','通信物流','生活用品','交通出行','休闲娱乐']
data1 = [2202,2234,1924,2157,1985,3014,2310]
data2 = [957,1234,1201,784,2147,1423,982]
#堆积条形图
plt.barh(label,data1)
plt.barh(label,data2,left=data1)
plt.show()
4. 堆积面积图
stackplot(x,y) 适用于直观地感受每一组数据的面积的对比
只写一个数据是没有意义的
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
label = ['购物','人情往来','餐饮美食','通信物流','生活用品','交通出行','休闲娱乐']
data1 = [2202,2234,1924,2157,1985,3014,2310]
data2 = [957,1234,1201,784,2147,1423,982]
plt.stackplot(label,data1)
plt.show()
案例
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
label = ['购物','人情往来','餐饮美食','通信物流','生活用品','交通出行','休闲娱乐']
data1 = [2202,2234,1924,2157,1985,3014,2310]
data2 = [957,1234,1201,784,2147,1423,982]
plt.stackplot(label,data1,data2)
plt.show()
案例
数据格式
import matplotlib.pylab as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-4 .xls')
label = df['月份']
data1 = df['A公司']
data2 = df['B公司']
data3 = df['C公司']
plt.stackplot(label,data1,data2,data3)
plt.show()
5. 直方图
直观的观测一组数据的分布:优(90-100)有几个
柱形图,柱子是有缝隙的
直方图的x轴是连续的数据
hist(x,bins)
x:一组数据(数据量要大,仅有数据本身,图会为这个数据分组和计算)
bins:直方图的柱子的个数,默认是10 个
也可以自己画区域 bins=[50,60,70,80,90,100]
import matplotlib.pylab as plt
data = [90,59,89,84,67,86,76,97,87,53,63,63,72,60,52,52,76,73,99,90,79,71,80,70,97,95,87,93,51,58,65,75,65,68,66,92,80,51,93,69,
85,99,97,86,55,82,100,86,83,62,90,91,71,79,58,55,51,81,71,63,73,93,74,73,56,77,69,94,77,82,89,81,53,78,54,55,62,82,86,74,
93,96,55,56,68,90,92,76,77,60,71,51,68,68,84,71,77,100,73,80,73,71,69,98,89,88,84,97,83,78,97,64,53,88,65,55,81,82,70,52,
77,75,71,82,97,72,95,91,75,91,77,53,83,95,55,89,53,95,92,74,97,64,77,58,74,57,92,74,54,66,59,90,51,67,58,64,52,69,62,54,
100,85,91,96,95,56,53,77,76,74,98,70,75,71,98,79,93,59,84,76,98,73,96,61,79,78,97,91,78,84,86,63,66,63,93,53,69,52,53,80,
86,79,80,96,76,85,66,65,56,89,88,71,52,99,71,78,58,76,81,86,84,97,53,93,92,88,84,67,92,78,71,60,98,73,79,96,79,64,74,96,
93,89,88,63,72,78,57,60,54,84,98,93,54,95,70,99,56,80,80,98,51,71,70,96,88,80,83,88,77,85,75,69,74,76,96,86,62,73,57,87,
56,65,90,59,64,70,81,76,74,80,81,88,62,94,96,58,54,83,86,91,92,51,89,64,83,52,76,79,74,58,95,76,55,91,57,60,65,91,60,71,
58,55,92,71,54,83,79,83,93,59,53,67,63,61,53,88,72,91,61,99,79,69,61,58,69,70,58,52,78,92,69,77,76,86,52,81,97,90,51,79,
66,87,84,73,72,70,95,55,56,60,59,72,60,87,89,95,58,79,92,68,77,53,90,88,83,55,73,53,96,83,57,68,97,56,97,69,74,57,51,52]
plt.hist(data,bins=[50,60,70,80,90,100])
plt.show()
5.1 正态直方图
import matplotlib.pylab as plt
import numpy as np
state = np.random.RandomState(2024)
data = state.randn(20000) #生成的是平均值为0,标准差为1的标准正态分布数据
plt.hist(data)
plt.show()
6. 饼图
pie(x,labels)
x:需要画成饼图的数据组 必须写的
x的数据不能是百分比
labels:是文字描述
autopct:pct是percent百分比的缩写
表示百分比格式是 pct='%数值的格式%'
数值的格式: %s是字符串的输入输出格式
%d是整数的输入输出格式
%f是小数的输入输出格式 %.1f 小数点后1 位
pctdistance:百分比所书写的位置,默认0.6
radius:饼图的半径,默认是1
explode:扇形离开圆心的距离,每一个扇形都需要描述缝隙
explode = [0.1,0.1,0.2,0.1,0.1,0.1,0.1,]
shadow:阴影,默认为False
wedgeprops:画环形图需要用的参数,值是一个字典类
wedgeprops={'width':0.7}
wedgeprops={'width':0.5,'edgecolor':'w'}
6.1 普通饼图
import matplotlib.pylab as plt
x = [800,100,1000,200,300,200,200,200]
plt.pie(x)
plt.show()
添加标记
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
lbs = ['购物','人情外来','餐饮美食','通信物流','生活日用','交通出行','休闲娱乐','其他']
x = [800,100,1000,200,300,200,200,200]
plt.pie(x,labels=lbs)
plt.show()
给标记添加百分比
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
lbs = ['购物','人情外来','餐饮美食','通信物流','生活日用','交通出行','休闲娱乐','其他']
x = [800,100,1000,200,300,200,200,200]
plt.pie(x,labels=lbs,autopct='%.1f%%',pctdistance=0.8,radius=1.2,explode=[0.05]*8)
plt.show()
6.2 环形饼图
基础环形
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
labs = ['医疗保健','文化娱乐','交通信号','生活服务','居住','衣着','食品烟酒','其他']
data = [1843,2032,2762,1260,5215,1238,6397,462]
plt.pie(data,labels=labs,
autopct="%.1f%%",
wedgeprops={'width':0.5})
plt.show()
加了部分参数
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
labs = ['购物','人情往来','餐饮美食','通信物流','生活日用','交通出行','休闲娱乐','其他']
data = [800,100,1000,200,300,200,200,200]
exp = [0.06]*8
exp[7]=0.15
plt.pie(data,labels=labs,autopct="%.1f%%",
pctdistance=0.8,radius=1.4,explode=exp,
shadow=True,wedgeprops={'width':0.5,'edgecolor':'r','linewidth':1.5})
plt.show()
案例
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('23年12月月票.xls',index_col=0)
data = df.groupby('类型')['书名'].count()
plt.pie(data.values,labels=data.index,
autopct='%.f%%',
pctdistance=0.8,
wedgeprops={'width':0.6,'edgecolor':'w'},
radius=1.5
)
plt.show()
6.3 圈圈套圈圈
6.4 案例1
将excel数据导入
index_col可以将excel的第0列,指定为df的index列
import pandas as pd
df = pd.read_excel('23年12月月票.xls',index_col=0)
print(df)
7. 散点图
查看数据的聚集,预测趋向的图。
特点:数据量较大,分布没有固定的规律。能够从聚集中看到趋向。
案例
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('23年12月月票.xls',index_col=0)
plt.figure(figsize=(10,4))
plt.scatter(df['类型'],df['月票'])
plt.show()
x轴最好是连续数值,便于通过x轴的变化,查看y轴的变化
s 是 散点的面积
marker 是散点的图形
alpha 是透明度
随机数案例
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,4))
x = np.random.rand(100)
y = np.random.rand(100)
al = np.random.rand(100)
ss = np.random.rand(100)*50
plt.scatter(x,y,marker="*",s=ss,alpha=al)
plt.show()
总消费 小费案例
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_excel('tips.xlsx')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,4))
plt.scatter(df['总消费'],df['小费'])
plt.show()
8. 箱图
描述的是:大量的数据分布的情况。最大,最小,中间,聚集倾向等等。
适合科学研究和比对问题。
boxplot(x,vert)
x 是数据
vert 是方向 :默认是 。vert=Flase 水平放箱子
总消费
小费
案例
数据格式
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-7.xls')
data1 = df[df['年份']=='2018年']['发电量']
data2 = df[df['年份']=='2019年']['发电量']
# print(data1,data2)
plt.boxplot([data1,data2],labels=('2018年','2019年'),
meanline=True,widths=0.5,vert=False,patch_artist=True)
plt.show()
9. 雷达图
polar(angles,data) 雷达图并不是输入数据,会自动画图的
雷达图的所有的角,都需要用户自己定位 每一个点都是极坐标定位的
angles:每一个点所在的角度(记录的是弧度)
如果是4个点 数据为[角1,角2,角3,角4]
如果是6个点 数据为[角1,角2,角3,角4,角5,角6]
[0°,60°,120°,180°,240°,300°]
[0,π/3,2π/3,4π/3,5π/3]
data:数值所在的列表[3,6,4,8,6,2]
原数据
[0,np.pi/3,2*np.pi/3,np.pi,4*np.pi/3,5*np.pi/3]
[3,6,4,8,6,2]
六个角需要定义七个角度和数据
import matplotlib.pyplot as plt
import numpy as np
angles = [0,np.pi/3,2*np.pi/3,np.pi,4*np.pi/3,5*np.pi/3,2*np.pi]
datas = [3,6,4,8,6,2,3]
plt.polar(angles,datas)
plt.show()
解决方法
为图表画网
plt.thetagrids(angles*180/np.pi,labels)
案例1
数据格式
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
data = pd.read_excel('雷达图.xlsx')
angles = np.linspace(0,2*np.pi,11)
data1 = data['产品1']
data2 = data['产品2']
data3 = data['产品3']
plt.polar(angles,np.concatenate((data1,[data1[0]])))
plt.thetagrids(angles*180/np.pi,np.concatenate((data['标签'],[data['标签'][0]]))) #加网格
plt.fill(angles,np.concatenate((data1,[data1[0]])),alpha=0.3) #上色
plt.polar(angles,np.concatenate((data2,[data2[0]])))
plt.fill(angles,np.concatenate((data2,[data2[0]])),alpha=0.3)
plt.polar(angles,np.concatenate((data3,[data3[0]])))
plt.fill(angles,np.concatenate((data3,[data3[0]])),alpha=0.3)
plt.show()
案例2
数据格式
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('2-8.xls',index_col=0) # 导入表
data = df.T
labs = data.index # 一维数据的连接,获取labels
data1 = np.concatenate((data,[data.loc['研究型']])) # 二位数据的连接
plt.polar(np.linspace(0,2*np.pi,7),data1) # 画雷达
plt.fill(np.linspace(0,2*np.pi,7),data1,alpha=0.2) # 涂颜色
plt.thetagrids(np.linspace(0,360,7),np.concatenate((labs,[labs[0]]))) # 画网格
plt.show()
练习题
一、
数据格式
1.1 簇状柱形图
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('第2章.xlsx',sheet_name='4-1')
x = df['学科']
y1 = df['平均成绩(男)']
y2 = df['平均成绩(女)']
plt.bar(np.arange(1,7)-0.4,y1,tick_label=x,width=0.4)
plt.bar(np.arange(1,7),y2,tick_label=x,width=0.4)
plt.show()
1.2 堆积柱形图
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('第2章.xlsx',sheet_name='4-1')
x = df['学科']
y1 = df['平均成绩(男)']
y2 = df['平均成绩(女)']
plt.bar(x,y1)
plt.bar(x,y2,bottom=y1)
plt.show()
二、
数据格式
2.1 饼图
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('第2章.xlsx',sheet_name='4-2')
lbs = df['子类目']
data = df['销售额']
plt.pie(data,labels=lbs,autopct='%.1f%%',pctdistance=0.8)
plt.show()
2.2 折线图
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('第2章.xlsx',sheet_name='4-2')
x = df['子类目']
y = df['销售额']
plt.plot(x,y)
plt.show()
附录A. Numpy
A.1 数组基础
A1.1 数组的定义
import numpy as np #载入的库
创建一个一维数组:
np.array([4,2,5,7,8,6,3]) ----基础的一维数组的定义
np.arange(8) ---- 基础的序列的定义 [0,1,2,3,4,5,6,7]
np.arange(3,40,7) ---从3到40,步长值为7
创建一个二维数组:
np.array([[2,1,4,5,3,6],[5,4,7,1,6,8],[6,2,3,4,1,2]])
创建随机数组:
Excel中创建随机数:rand() 生成0~1之间的随机数
excel的rand随机数,每个数的几率都是一样的
相当于几率相同的随机数:np.random.randint()函数
np.random.randint(8)得到的是一个8以内的整数
np.random.randint(0,100,10)得到的是一个10个1~100之间的随机数
创建正态分布的随机数
state = np.random.RandomState(2024)
state.randn(number)
A1.2 数组的属性
1、len()只计算了第一个维度的长度 x = np.array([3,10,17,24,31,38]) y = np.array([[2,1,4,5,3,6],[5,4,7,1,6,8],[6,2,3,4,1,2]]) print(len(x),len(y)) ---输出结果 6 32.size属性,计算的数组中的元素数量
print(x.size,y.size) ---输出结果 6 183.shape属性,得到的是数组的维度
print(x.shape,y.shape) ---输出结果 (6,) (3,6)4.T属性,转置
转置前,转置后
A.2 运算基础
np.abs(-3) -------求绝对值
np.mod(9,2) ------求 9 模 2 余数为 1
np.power(4,2) ----- 求4 的2次方
np.sqrt(16) ----- 求根号16 结果为小数4.0
np.sin(弧度) ---- 求sin值 ------括号中是弧度,不是角度
弧度 | 角度 |
0 | 0 |
π/2 | 90 |
π | 180 |
3π/2 | 270 |
2π | 360 |
5π/2 | 450 |
π -----> np.pi ------> 3.1415926355897932846
np.linspace(start,end,number) 从start到end,取number个节点(默认包含头尾点)
绘制正弦
import numpy as np
import matplotlib.pylab as plt
x = np.linspace(0,2*np.pi,100)
plt.plot(x,np.sin(x))
plt.show()
附录B. Pandas
B.1 series(一维数据)
1、导入的文件的分类
直接存储文字内容,根据编码形式:utf8 gbk
utf8:更支持西文,西文字符 1个字节,中文字符 3 个字节
gbk:所有字符都是 2 字节
比如:txt html py sh json xml java c bat csv ......
2、字节型文件
需要存储的内容不单单是文字,有更多的东西
比如:音乐、图片、文档(doc、excel、mdb)
需要指定的软件才能操作
B.1.1 数组的定义
B.1.2 数组的属性
B.2 dataframe(二维数据)
B.2.1 DF的概念和属性
df的导入分类:字符型:json(接近字典) csv(excel) txt(都行)
json.load(f) pd,red)csv()
字节型: excel 数据库
read_excel()
常见的问题错误1:字符型读入的时候,容易出现编码错误
设置encoding的值
常见的问题错误2:
B.2.2 数据的输入和输出
数据库sql | pandas的dataframe | |
基本筛选 | select * from books where type='都市'; | df['类型']=='都市' |
简单排序 | order by | |
聚类+筛选 | sum() avg() max() min() count() | |
分组+计算 | select 分组字段,聚类计算 from 表名 group by 分组字段 |
从表格读取数据
import pandas as pd
df = pd.read_excel('23年12月月票.xls',index_col=0)
print(df)
单独输出一列数据
月票大于10000的
计数
import pandas as pd
df = pd.read_excel('23年12月月票.xls',index_col=0)
print(df[df['月票']>10000]['书名'].count())
# 或
# print(df[df['月票']>10000].count()['书名'])
分组+计算
df的groupby方法 : df.groupby('分组字段')
用聚类函数对每个子表进行聚类运算,结果合并一个结果
df.groupby('分组字段').count()
df.groupby('分组字段').sum() ----结果计算一个df数据
案例:
计算月票的平均数
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_excel('23年12月月票.xls',index_col=0)
data = df.groupby('类型')['月票'].mean()
plt.figure(figsize=(10,4))
plt.bar(data.index,data.values)
plt.show()
表的连接
横着连:
学生信息表 + 选课信息表
表A和表B 有1或多个字段,是相互对应的
学生信息表(学号pk,姓名,性别,电话,班级,总学分)
选课信息表(学号pk,课程号pk,课程名称,任课教师,电话,学分)
pd.merge() 横着连接的方法
竖着连:
相同格式的数据
pd.concat()
补充:很多文件如何都读取
表格都放在qd文件夹内了 多表连接
import pandas as pd
import os
dfls=[]
for fname in os.listdir('C:/Users/Administrator/Desktop/qd/'):
dfls.append(pd.read_excel("C:/Users/Administrator/Desktop/qd"+"/"+fname,index_col=0))
df = pd.concat(dfls)
del df['连载'] #删除不需要的列,可不加
del df['更新时间'] #删除不需要的列,可不加
# df.to_excel('ww.xlsx') #输出查看效果,可不加
newdf = df.drop_duplicates('书名') #以书名为依据去重
print(newdf)
excel的读入和写出:
读入:read_excel()
自动为读入的表添加一列index,range(len(df))
read_excel(***.xlsx,index_col=0) 参数将表格的第一列作为idnex列
核心是先看看表格第一列是什么
写入:to_excel()
写入到excel的时候,默认写上index作为第一列
to_excel(***.xlsx,index=Flase) 写入到excel的时候,不写index列