Python利用Pandas导出结果、数据可视化

Pandas结果导出

Pandas封装了很多导出结果的方法,类似于读取。

导出为Excel

注意:需要安装依赖模块openpyxl

1
df.to_excel(r'文件名.xlsx')

如果原来的DataFrame没有Index列,则在生成的时候会多处一列index

1
2
3
4
5
df.to_excel(r'文件名.xlsx', index = False) # 不生成默认index列

df.to_excel(r'文件名.xlsx', sheet_name = 'Sheet1') # 可以指定sheet_name

df.to_excel(r'文件名.xlsx', columns = ['col1', 'col2']) # 也可以只导出指定列

导出为CSV

1
df.to_csv(r'filename.csv', index = False, sep = '#') # 可以不生成默认index列,也可以自定义分隔符

如果遇到编码错误,则在保存的时候添加参数encoding = ‘utf_8_sig’

数据可视化

数据可视化的基本流程

  1. 整理数据
  2. 明确目的
  3. 寻找合适的表现形式

展现结果的方式有哪些:

  • 文字
  • 表格
  • 图形
1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt

#如果使用jupyter notebook 来在单元格中直接显示图形,需要设置一些属性
%matplotlib inline

#解决中文乱码问题,针对Windows
plt.rcParams['font.sans-serif'] = 'SimHei'

# 解决负号无法显示的问题
plt.rcParams['axes.unicode_minus'] = False

#让图表显示矢量图,更加清晰
%config InlineBackend.figure_format = 'svg'

如何建立画布和坐标系

创建画布

matplotlib会自动提供一个画布对象,如果使用自定义的画布对象,则就需要新建一个figure对象,如下

1
fig = plt.figure(figsize = (8, 6)) # 创建画布对象,figsize规定了画布的大小

创建坐标系

有四种方法。

add_subplot方法

该方法是figure对象的子函数

1
2
3
4
5
6
7
ar1 = fig.add_subplot(1, 1, 1) # 三个参数的含义:第一个参数代表坐标系的行数,第二个参数代表坐标系的列数,第三个参数代表当前坐标系的序号,该序号是一个从1开始的自然数。

#创建多个坐标系只需要改变第三个参数即可
ar1 = fig.add_subplot(2, 2, 1)
ar2 = fig.add_subplot(2, 2, 2)
ar3 = fig.add_subplot(2, 2, 3)
ar4 = fig.add_subplot(2, 2, 4)

该方法在代码执行完后不显示图像,需要手动显示

plt.subplot2grid方法

无需figure对象,直接是matplotlib的子函数

1
plt.subplot2grid((2, 2), (0, 0)) # 创建一个两行两列的坐标系(第一个参数),指定当前坐标系是第一行第一列的那一个(第二个参数)

plt.subplot方法

1
plt.subplot(2, 2, 1) # 创建一个两行两列的图像(第一个参数),指定当前是第一个(第二个参数),代码执行完后显示坐标系。序号是从1开始的自然数(第三个参数)

plt.subplots方法

1
2
fig, axes = plt.subplots(2, 2) # 直接显示四个图像
axes[0] # 通过指定axes的索引值来选择当前坐标系

利用坐标系创建图形

1
2
3
4
5
6
7
import numpy as np

x = np.arange(6)
y = np.arange(6)

plt.subplot(1, 1, 1) # 绘制一个坐标系的时候(无子图时),这句可有可无
plt.plot(x, y) # 绘制折线图

注意:如果自定义了figure对象,那么所有的画图方法都会按照figure对象的设置来

基本属性设置

设置坐标轴标题

1
2
3
4
5
6
7
plt.plot(x, y) # 画图

plt.xlabel('x轴标题') # 设置x轴标题
plt.ylabel('y轴标题') # 设置y轴标题

#可以添加参数,以x轴为例,y轴类似
plt.xlabel('x轴标题', labelpad = 5, fontsize = 'xx-large', color = 'r', fontweight = 'bold') # 设置x轴标题,labelpad规定标题到坐标轴的距离,fontsize规定标题的大小,color规定标题的颜色,fontweight规定了标题的字重

设置坐标轴的刻度

1
2
3
4
plt.plot(x, y)

plt.xticks(x, [(str(i + 1) + '月') for i in range(6)]) # 设置x轴刻度值,第一个参数代表哪个轴,第二个参数代表包含刻度的列表
plt.yticks(y, [(str(i + 1) + '人') for i in range(5)]) # 设置y轴的刻度值,参数意义同上

设置刻度线的显示模式

1
plt.tick_params(which = 'both', direction = 'inout', labelbutton = False)

设置表格的网格线

1
plt.grid(True) # 是否绘制网格线,还有which和axis两个参数可选

设置图例

如果要显示图例,必须在plot方法里设置label参数,否则图例无法显示

1
plt.legend() # 直接调用空方法即可显示图例。该方法有一个loc参数,默认取值是best,意味着程序将选择最合适的位置来生成图例。

设置图表标题

1
plt.title('1-6月份注册人数统计图') # 存在一个loc参数,指定标题显示位置,默认为center

添加数据标签

1
plt.text(2, 2, '节点标签', ha = 'center', va = 'bottom') # 前两个参数是标签显示的位置,最后一个参数是标签文字。可选参数有va:垂直对齐、ha:水平对齐、fontsize:字号

常见的统计图形绘制

常见的统计图形有:

  • 折线图
  • 柱状图
  • 条形图
  • 直方图
  • 箱型图
  • 散点图

折线图

1
2
3
4
x = [x for x in range(1,11)]
y = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]

plt.plot(x, y, 'r*') # 第三个参数含义:颜色为红色、点为星号表示,没有连线

柱状图

1
2
3
4
5
6
7
x = [x for x in range(1,11)]
y = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]

plt.bar(x, y) # 直接绘制柱状图

plt.bar(x, y, width = 0.5, align = 'center', label = '图标标签') # 参数width:柱的宽度、align:对齐方式、label:图例标签,必须使用legend方法来显示
plt.legend() # 显示label中的图标标签

柱状图上显示数字

1
2
for a, b in zip(x, y):
plt.text(a, b, b, ha = 'center', va = 'bottom', fontsize = 10)

柱状图有两个变形:

  • 簇状柱状图
  • 堆积柱状图

簇型柱状图

1
2
3
4
5
6
7
8
x = np.array([x for x in range(1,11)]) # 用python原生列表做会出现问题
y1 = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]
y2 = [788, 1325, 6710, 3482, 5140, 605, 1803, 2492, 3631, 3896]

plt.bar(x - 0.15, y1, width = 0.3, align = 'center', label = 'y1标签')
plt.bar(x, y2, width = 0.3, align = 'center', label = 'y2标签') # 两个柱状图分别向左/右移动0.15个单位,错开两者即可

plt.legend()

对两个柱状图添加数据标签如下:

1
2
3
4
for a, b in zip(x, y1):
plt.text(a, b, b, ha = 'center', va = 'bottom', fontsize = 10)
for a, b in zip(x, y2):
plt.text(a, b, b, ha = 'center', va = 'bottom', fontsize = 10)

堆积柱状图

1
2
3
4
5
6
x = np.array([x for x in range(1,11)]) # 用python原生列表做会出现问题
y1 = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]
y2 = [788, 1325, 6710, 3482, 5140, 605, 1803, 2492, 3631, 3896]

plt.bar(x, y1, width = 0.3, align = 'center', label = 'y1标签')
plt.bar(x, y2, width = 0.3, bottom = y1, align = 'center', label = 'y2标签') # 堆积柱状图的关键就是堆在上面的柱状图需要有一个bottom参数,该参数的值为下面柱状图的因变量序列

条形图

1
2
3
4
x = np.array([x for x in range(1,11)]) # 用python原生列表做会出现问题
y = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]

plt.barh(x, height = 0.5, width = y) # height参数指定了横条的高度,width参数是宽度参数,让其等于y列表的值才符合要求

直方图

主要观测数据的分布形态,主要作用于连续型变量。横坐标代表数据的分段(频数),纵坐标代表频率

1
2
3
4
5
6
7
data = np.random.randn(10000) # 随机生成10000个符合正态分布的数据
ser = pd.Series(data)
ax = ser.plot(kind = 'hist', bins = 20, facecolor = 'red') # 通过指定kind参数来让plot确定画什么类型的图标,bins指的是划分成若干个区间,facecolor表示颜色
ser.plot(kind = 'kde', ax = ax, secondary_y = True) # 画出和密度图,启用第二y轴坐标

df = pd.DataFrame(data, colomns = ['id'])
df['id_bin'] = pd.cut(df['id'], bins = 20) # cut方法将一列的值拆分成bin参数所指定个数的区间

散点图

观测变量分布时常用,也用于观测各个变量之间的相关关系。

1
2
3
4
x = np.array([x for x in range(1,11)]) # 用python原生列表做会出现问题
y = [866, 2335, 5710, 6482, 6120, 1605, 3813, 4482, 4631, 7896]

plt.scatter(x, y, marker = 'o', s = 50) # size参数规定的是marker的大小

注:查看内存使用的方法为sys.geisizeof(变量),就会返回变量占用的内存