Python中的Pandas、Matplotlib库详解
Pandas数据分析库
1)Pandas是目前Python生态圈最常用的数据分析工具库。该库以Numpy为基础,增加了标签支持,整合了对数据集的读取、清洗、转换、分析、统计、绘图等一系列工作流程,能够高效地处理和分析结构化数据。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。Pandas适合处理数值和字符串混杂数据,numpy适合处理统一的数值数据。
2)引入pandas的惯例
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
Pandas的基本数据结构
1.序列(Series)
Pandas提供了三种基本数据结构
- Series:带标签的一维数组
- DataFrame:带标签的二维数组(即表格)
- Panel:带标签的三维数组(若干表格的叠加面板)
主要使用Series
和DataFrame
。与NumPy数组相比,Pandas最重要的改进是增加了标签(也称轴索引),可以实现自动的按索引对齐运算
范例:
import pandas as pd
from pandas import DataFrame, Series
pd.__version__ # 版本号 0.25.1
s1=Series([10,20,30]) # 创建Series,默认整数索引0~2
s2=Series([10,20,30], index=['a','b','c']) # 创建并指定索引
s2['a'] # 按标签访问,10
s2[0] # 按整数下标访问,10
s2['a':'c'] # 标签切片,3个数据
s2[0:2] # 按整数索引切片,2个数据
# 求和,均值,中位数
s2.sum(), s2.mean(), s2.median()
s2['a']=100 # 修改'a'标签对应的值
s2['d']=200 # 通过赋值创建新标签
2.标签自动对齐运算
s1 = Series([1, 2, 3], index=list('axb'))
s2 = Series({'a':10, 'b':20, 'c':30})
s1 + s2
Series具有标签,运算时自动对齐标签进行计算,这是Pandas相比NumPy的重要改进。s1的标签为['a','x','b']
, s2的标签为['a','b','c']
,执行s1 + s2 时,两者都有的’a’、‘b’标签自动对齐,对应的数值相加;两者互不匹配的’c’、'x’标签相加后的值为NaN。NaN(not a number)是Pandas中表示非数值或缺失值的符号。
3.数据框(DataFrame)
DataFrame(数据框)是Pandas最重要的数据结构。数据框可视为由行和列构成的二维表格,每行或每列都可视为一个Series。DataFrame既有行索引(index)又有列索引(columns)。
范例:
data = {'apple': [1100,1050,1200], 'huawei': [1250,1300,1328], 'oppo': [800,850,750]}
df = DataFrame(data, index=['一月', '二月', '三月']) # index行标签
df['apple'] # 访问一列
df.loc['一月'] # 访问一行,不能写为df['一月']
df.loc['一月', 'apple'] # [行标签,列标签] 1100
访问数据
1.数据框有多种灵活的访问形式。
df = DataFrame(np.arange(12).reshape(3,4), index=['a','b','c'], columns=['c1','c2', 'c3','c4'])
df.info() # 显示列名及数据类型
df.head(2) # 显示头两行
df.tail(2) # 显示末尾两行
2.loc[ ]、iloc[ ]访问
1)按列访问
访问列数据时使用object['列名']
或object.列名
的形式。
df['c1'] # 访问c1列,也可写为df.c1
2)按列访问
df[ ['c1', 'c3'] ] # 访问c1, c3两列,注意多个列名要放入[ ]
df[df.c1 > 3] # 按条件访问,只显示c1列>3的行
df[(df.c1 > 3) & (df.c2 > 5)] # 按条件访问,c1列>3且c2列>5
Tips:[ ]内的逻辑运算符要使用 &(与)、|(或)、~(非),不能使用Python的and、or、not运算符。[ ]内的逻辑表达式要用小括号括起来,如上例中的(df.c1>3)&(df.c2>5)
。
3)loc[]基于标签而iloc[]
基于整数下标,所以不能出现loc[1]
、iloc['a']
这样的写法。另外,loc['a':'c']
将包含结尾的’c’标签,而iloc[0:2]
不包含结尾的第2行。
算术运算和对齐
Pandas支持标签访问数据,运算时会自动基于标签对齐进行计算。运算数据若是Series则只有行标签,若是DataFrame则会在行、列两个方向上对齐标签再计算,标签不匹配的数据元素默认标记为NaN值。
范例:
df = pd.DataFrame(np.arange(9).reshape(3, 3), index=list('abc'), columns=list('xyz'))
s = pd.Series([1, 2, 3], index=list('xyz'))
df + s
Pandas基于NumPy,所以NumPy的通用函数都可以在Pandas中使用。
数据整理
1.行的插入/删除
# 字典参数, 在末尾插入新行,注意ignore_index=True
df = df.append({'姓名':'d','学号':'A4','成绩1':89,'成绩2':78}, ignore_index=True)
DataFrame的很多命令并不直接改变原数据框,而是返回新数据框,这和列表的处理方式不同。要直接修改原数据框,可将命令写为df=df.append() 的形式。
删除行使用drop()方法。
df.drop(2, inplace=True) # 按索引删除第2行, inplace= True表示就地修改原数据框
2.列的插入/删除
创建新列最简单的方法是直接给一个新列赋值,新列默认插在最后。要注意提供的数据个数应等于数据框的行数。
df['性别'] = ['M', 'F'] # 增加"性别"列,给新列赋值即可插入列
Matplotlib绘图库
1)概述:数据可视化是指以图形的方式展示数据。
Matplotlib简介
1)图形输出分为嵌入模式和独立窗口模式两种。嵌入模式在IPython的交互窗口中显示图形,图形显示后不能再修改。独立窗口模式在弹出的一个窗口中显示图形,图形可以放大、缩小和修改。
In: %matplotlib inline # 设置嵌入模式,左下图
In: %matplotlib # 设置独立窗口模式,右下图
2)范例:绘制 y = x^2 曲线
import numpy as np
import matplotlib.pyplot as plt # 导入plt
x = np.linspace(-2, 2, 50) # 在区间[-2, 2]内等间距产生50个点
y = x**2 # 计算平方值
plt.plot(x,y)
plt.plot(x,y,color='blue',ls='--',label='y=x^2') # 绘曲线并设定蓝色、破折线、图例
plt.xlabel('x', fontsize=14) # x轴标记字符x
plt.ylabel('y', fontsize=14) # y轴标记字符y
plt.title('Example', fontsize=18) # 设置标题
plt.legend() # 显示图例(y=x^2)
plt.show() # 显示图形(该句可省略)
3)颜色、线型和标记符号
作图时需要指定线条的颜色、线型、标记符号等参数,语句格式如下。
plt.plot( x, y, ls='线型', color='颜色', marker='标记', lw=线宽)
linestyle参数表 | 描述 |
---|---|
- | 实线 |
– | 破折线 |
-. | 点划线 |
: | 虚线 |
‘None’ | 空白(不画线) |
颜色名称 | 描述 |
---|---|
r | 红色 |
k | 黑色 |
b | 蓝色 |
c | 青色 |
y | 黄色 |
w | 白色 |
g | 绿色 |
标记 | 描述 |
---|---|
o | 圆圈 |
. | 点 |
D | 菱形 |
+ | 加号 |
v | 一角朝下的三角形 |
> | 一角朝右的三角形 |
None | 空白 |
s | 正方形 |
* | 星号 |
d | 小菱形 |
x | X号 |
< | 一角朝左的三角形 |
^ | 一角朝上的三角形 |
几种常见的图形
命令名 | 图形类型 |
---|---|
plt.plot() | 折线图 |
plt.pie() | 饼图 |
plt.hist() | 直方图 |
plt.boxplot() | 箱线图 |
plt.bar() | 柱形图 |
plt.barh | 水平条形图 |
plt.scatter() | 散点图 |
多图绘制
1)可以在一张图上同时显示多个子图形以便进行比较研究。绘制多子图可借助 figure 画布对象,这个对象用于创建子图。
范例:
x = np.arange(1,100)
fig = plt.figure() # 创建一个figure对象
ax1 = fig.add_subplot(2,2,1) # 2行x 2列图形的第一个子图
ax1.plot(x, x)
ax2 = fig.add_subplot(2,2,2) # 2行x 2列图形的第二个子图
ax2.plot(x, -x)
ax3 = fig.add_subplot(2, 2, 3) # 2行x 2列图形的第三个子图
ax3.plot(x, x**2)
ax4 = fig.add_subplot(2, 2, 4) # 2行x 2列图形的第四个子图
ax4.plot(x, np.log(x))
使用Pandas绘图
1)df.plot(kind='bar', rot=0)
语句指定做一个柱形图。pandas自动以每行为一组数据,每组数据中含3个列数据, 结果绘制出4组柱形对比图。列索引名"ABC"成为图例,行索引"一二三四"成为X轴上的标记。rot=0指定标记文字旋转角度为0,如不设定旋转角度值,文字默认会旋转90度。
2)kind='类型'
参数用于指定作图的类型,常用的类型有line(折线图)、bar(柱形图)、barh(水平条形图)、pie(饼图)、kde(密度图)、hist(直方图)等。如不指定类型则默认为折线图。
范例:
df.A.plot(kind='pie', title='A列数据', fontsize=16) # 以A列数据做饼图
df.plot(kind='bar', stacked=True, rot=20) # stacked=True堆积柱形图