Python数据分析三剑客:NumPy、Pandas、Matplotlib
目录
简介
1、数据分析三剑客简介
2、NumPy 概述
2.1 什么是 NumPy
2.2 NumPy 的特点
3、Pandas 概述
3.1 什么是 Pandas
3.2 Pandas 的核心数据结构
3.3 Pandas 的主要功能
4、Matplotlib 概述
4.1 什么是 Matplotlib
4.2 Matplotlib 的特点
5、三者的关系
5.1 层次依赖关系
5.2 功能互补关系
5.3 代码示例
一、numpy
1、安装、导入
1.1 安装:
1.2 导包numpy
2、NumPy 核心数据结构:ndarray
2.1 创建数组
2.2 数组属性
3、NumPy 数组操作
3.1 数组索引和切片
3.2 数组形状操作
4、NumPy 数学运算
4.1 基本运算
4.2 统计运算
5、NumPy 广播机制
二、pandas
1、Pandas 安装和导入
1.1 安装 Pandas
1.2 导入 Pandas
2、Pandas 核心数据结构
三、Matplotlib
简介
1、数据分析三剑客简介
- NumPy:数值计算基础库,提供高性能的多维数组对象
- Pandas:数据处理和分析库,提供强大的数据结构和数据分析工具
- Matplotlib:数据可视化库,提供丰富的绘图功能
2、NumPy 概述
2.1 什么是 NumPy
NumPy(Numerical Python)是Python科学计算的基础包,它提供了:
- 快速高效的多维数组对象 ndarray
- 用于对数组执行元素级计算以及直接对数组执行数学运算的函数
- 用于读写硬盘上基于数组的数据集的工具
- 线性代数运算、傅里叶变换,以及随机数生成
- 用于将C、C++、Fortran代码集成到Python的工具
2.2 NumPy 的特点
- 高效的数组运算:比纯Python代码快10-100倍
- 丰富的数学函数:支持大量的数学运算
- 广播功能:不同形状的数组之间的数学运算
- 底层语言实现:核心代码用C语言编写,执行效率高
3、Pandas 概述
3.1 什么是 Pandas
Pandas是基于NumPy构建的库,为Python编程语言提供了快速、强大、灵活且易于使用的数据结构和数据分析工具。
3.2 Pandas 的核心数据结构
- Series:一维带标签数组
- DataFrame:二维表格型数据结构
3.3 Pandas 的主要功能
- 数据清洗和准备
- 数据整理和转换
- 数据分析和建模
- 数据可视化
4、Matplotlib 概述
4.1 什么是 Matplotlib
Matplotlib是Python最著名的绘图库,它提供了一整套和MATLAB类似的绘图API,非常适合交互式绘图。
4.2 Matplotlib 的特点
- 丰富的图表类型:线图、散点图、柱状图、饼图等
- 高度可定制:可以控制图表的每一个细节
- 多种输出格式:支持PNG、PDF、SVG等格式
- 与IPython兼容:支持在IPython环境中交互式绘图
5、三者的关系
5.1 层次依赖关系
NumPy、Pandas 和 Matplotlib 三者构成了 Python 数据分析的完整技术栈,它们之间存在着清晰的层次依赖关系:
NumPy 是基础层
- 提供了高效的多维数组(ndarray)对象
- 是 Pandas 和 Matplotlib 的底层依赖
- 负责数值计算和数组操作
Pandas 是数据处理层
- 基于 NumPy 构建,使用 NumPy 数组作为底层存储
- 提供了更高级的数据结构(Series、DataFrame)
- 专注于数据清洗、整理和分析
Matplotlib 是可视化层
- 依赖于 NumPy 的数据结构
- 能够直接处理 Pandas 的数据对象
- 负责将数据转化为直观的图表
5.2 功能互补关系
三者各司其职,形成了完整的数据分析工作流:
NumPy - 数值计算引擎
- 核心功能:数学运算、线性代数、随机数生成
- 数据格式:ndarray 多维数组
- 优势:计算效率高,内存占用少
Pandas - 数据处理工具
- 核心功能:数据清洗、转换、聚合、分析
- 数据格式:Series(一维)、DataFrame(二维)
- 优势:数据操作便捷,支持缺失值处理
Matplotlib - 可视化平台
- 核心功能:图表绘制、图形定制、结果展示
- 输出形式:静态图片、交互式图表
- 优势:图表类型丰富,定制化程度高
5.3 代码示例
一、numpy
提供高性能的多维数组对象
1、安装、导入
1.1 安装:
# 使用 pip
安装 pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用 conda
安装 conda install numpy
1.2 导包numpy
import numpy as np # 惯例缩写为 np
2、NumPy 核心数据结构:ndarray
2.1 创建数组
import numpy as np # 创建一维数组 arr1 = np.array([1, 4, 5, 6, 7]) print(arr1, type(arr1), arr1.shape) # 创建二维数组 arr2 = np.array([[1, 2, 4], [3, 5, 5]]) print(arr2,arr2.shape) # 创建元素全为0的数组 arr_0 = np.zeros((3,4)) print(arr_0) # 创建元素全为1的数组 arr_1 = np.ones((2,3)) print(arr_1) # 创建有序数组,从0-12,步长为2 arr3 = np.arange(0, 12, 2) print(arr3) # 创建等分数组:0-2,等分4 arr4 = np.linspace(0, 2, 4) print(arr4) # 创建随机数组:0-1均匀分布,2行3列 arr5 = np.random.rand(2, 3) print(arr5) # 创建随机数组:正态分布、3行3列 arr6 = np.random.randn(3, 3) print(arr6)2.2 数组属性
import numpy as np arr1 = np.array([[1,2,3],[4,5,6]]) print(arr1) # 数组维度 print(f"array dimension:{arr1.ndim}") # 数组形状 print(f"array shape:{arr1.shape}") # 数组大小 print(f"array size:{arr1.size}") # 数组类型 print(f"array type:{arr1.dtype}")3、NumPy 数组操作
3.1 数组索引和切片
import numpy as np arr_index = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]] ) print(arr_index) # 索引 # 输出arr_index[3,4] print(arr_index[3,4]) # 切片 # 输出第二行 print(arr_index[1]) # 输出第二列 print(arr_index[:,1]) # 输出最后一行 print(arr_index[-1]) # 输出最后一列 print(arr_index[:,-1]) # 输出1-5步长为2的行,1-5步长为3的列 print(arr_index[0:6:2, 0:6:3]) # 布尔 # 输出大于5的数 print(arr_index[arr_index > 10])3.2 数组形状操作
import numpy as np # 生成一个有序一维数组 arr0 = np.arange(20) print(arr0) # 调整形状 arr_rs = arr0.reshape(4, 5) print(arr_rs) # 转置 print(arr_rs.T) # 展平 print(arr_rs.flatten()) # 调整大小-取前3*4个数据 print(np.resize(arr_rs, (3, 4))) # 调整大小-超出部分从前边开始轮询 print(np.resize(arr_rs, (3, 7)))4、NumPy 数学运算
4.1 基本运算
import numpy as np arr_a = np.arange(1, 6) arr_b = np.arange(5, 10) print(arr_a) print(arr_b) # 数组加法 print(arr_a + arr_b) # 数组减法 print(arr_a - arr_b) # 数组乘法 print(arr_a * arr_b) # 数组除法 print(arr_a / arr_b) # 数组整除 print(arr_a // arr_b) # 数组取余 print(arr_a % arr_b) # 数组除法 print(arr_b % arr_a) # 矩阵乘法 metrix_a = np.array([[1, 2], [3, 4]]) metrix_b = np.array([[5, 6], [7, 8]]) metrix_mul = np.dot(metrix_a,metrix_b) print(metrix_mul) # @ 实现矩阵乘法 print(metrix_a @ metrix_b)4.2 统计运算
import numpy as np arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 求和 print(arr1.sum()) # 求平均数 print(arr1.mean()) # 求方差 print(arr1.var()) # 求标准差 print(arr1.std()) # 求最大、最小值 print(np.max(arr1)) print(np.min(arr1)) # 求最大、小值的索引 print(np.argmax(arr1)) print(np.argmin(arr1))5、NumPy 广播机制
import numpy as np # 广播示例 a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = np.array([10, 20, 30]) c = np.array([[2],[3],[4]]) # 将b广播到a的每一行 print(a + b) # 将c广播到a的每一列 print(a * c) # 输出 ''' [[11 22 33] [14 25 36] [17 28 39]] [[ 2 4 6] [12 15 18] [28 32 36]] '''二、pandas
数据处理和分析
1、Pandas 安装和导入
1.1 安装 Pandas
# 使用 pip 安装 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple # 使用 conda 安装 conda install pandas1.2 导入 Pandas
import pandas as pd # 惯例缩写为 pd2、Pandas 核心数据结构
2.1 Series:一维带标签数组
import pandas as pd # 创建一维带标签数组 s1 = pd.Series([1, 2, 3]) print(s1) # 创建一维带执行指定标签的数组 s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c']) print(s2) # 输出全部标签 print(s2.index) # 输出所有值 print(s2.values)2.2 DataFrame:二维表格数据结构
import pandas as pd # 字典创建二维数组 data = { '姓名': ['张三', '李四', '王五', '赵六'], '年龄': [25, 30, 35, 28], '城市': ['北京', '上海', '广州', '深圳'], '工资': [5000, 7000, 6000, 8000] } p1 = pd.DataFrame(data) print(p1) # 列表创建二维数组 data_list = [ ['张三', 25, '北京', 5000], ['李四', 30, '上海', 7000], ['王五', 35, '广州', 6000], ['赵六', 28, '深圳', 8000] ] # index 执行行索引,column指定列索引 p2 = pd.DataFrame(data_list, index=[1, 2, 3, 4], columns=['name', 'age', 'city', 'galary']) print(p2) # 输出形状 print(p2.shape) # 输出列名 print(p2.columns) # 输出行名 print(p2.index) # 输出类型——会分别输出列的类型 print(p2.dtypes) #输出 ''' 姓名 年龄 城市 工资 0 张三 25 北京 5000 1 李四 30 上海 7000 2 王五 35 广州 6000 3 赵六 28 深圳 8000 name age city galary 1 张三 25 北京 5000 2 李四 30 上海 7000 3 王五 35 广州 6000 4 赵六 28 深圳 8000 (4, 4) Index(['name', 'age', 'city', 'galary'], dtype='object') Index([1, 2, 3, 4], dtype='int64') name object age int64 city object galary int64 dtype: object '''3、 DataFrame 基本操作
3.1 数据查看和选择
注意:取多行、多列时,需要使用[[元素]] 形式
df[['name', 'salary']]
df.loc[['p1','p3']]
df.
iloc[行选择器, 列选择器]:适用索引形式,获取行、列数据。
左开右闭,与列表、字符串一致逗号前面控制选取哪些行,逗号后面控制选取哪些列
import pandas as pd import pandas as ps data_list = [ ['张三', 25, '北京', 5000], ['李四', 30, '上海', 7000], ['王五', 35, '广州', 6000], ['赵六', 28, '深圳', 8000] ] df = pd.DataFrame(data_list, index=['p1', 'p2', 'p3', 'p4'], columns=['name', 'age', 'city', 'salary']) # 查看数据 print(df) # 输出前3行 print(df.head(3)) # 输出后两行 print(df.tail(2)) # 输出描述 print(df.describe()) # 选择列数据 # 取单列 print(df['name']) # 取多列,df[列表] print(df[['name', 'salary']]) # 选取行数据 # 按指定索引进行取数据:loc[] # 单行数据 print(df.loc['p1']) # 多行数据:df.loc[列表] print(df.loc[['p1','p3']]) # 使用自定义标签进行切片输出:左闭右闭 print(df['p1':'p3']) # 按默认索引进行数据: iloc[行选择器, 列选择器] # 使用默认标签进行切片输出:左闭右开 # 单行指定数据 print(df.iloc[0]) # 获取1行到结尾数据 print(df.iloc[1:]) # 获取1行到结尾行,2列到结尾列 print(df.iloc[1:,2:])3.2 数据筛选和过滤
import pandas as pd df = pd.DataFrame({ 'name': ['张三', '李四', '王五', '赵六', '钱七'], 'age': [25, 30, 35, 28, 32], 'department': ['技术部', '销售部', '技术部', '人事部', '销售部'], 'salary': [5000, 7000, 6000, 5500, 7500] }) # 筛选 # 方法一: print(df[df['age'] >= 30]) # 筛选年龄大于等于30的 # 方法二: print(df.query('age > 30')) print(df.query('age >30 and salary > 6000')) # 筛选年龄大于等于30并且薪资大于6000的 # 排序:默认升序 print(df.sort_values('salary')) print(df.sort_values('salary', ascending=False)) # 降序排列 print(df.sort_values(['department', 'salary'], ascending=[False, True]))4、数据处理和清洗
4.1 处理缺失值
import pandas as pd # reda_csv打开指定路径的csv文件 # sep分隔符,默认为英文逗号 df = pd.read_csv('./data/清洗数据.csv',sep=',') # print(df) # 检查缺失值 # 缺失值数量统计 print(df.isnull().sum()) # 非缺失值数量统计 print(df.notnull().sum()) # 删除缺失值 # 删除包含缺失值的行 df.dropna() # 删除全为缺失值的行 print(df.dropna(how='all')) # 删除指定列为空的行 df_cleaned = df.dropna(subset=['A']) # 填充缺失值 print(df.fillna(0)) print(df.fillna(df.mean()))4.2 数据转换
import pandas as pd df = pd.read_csv('./data/分组聚合数据.csv') print(df) # 分组聚合 print(df.groupby('产品')['销售额'].sum()) print(df.groupby(['产品', '地区'])['销售额'].agg(['sum','mean'])) print(df.groupby(['产品', '地区'])['销售额'].sum()) # 数据透视表进行分组聚合 print(df.pivot_table(index='产品', values='销售额', aggfunc='sum')) df.pivot_table(index=['产品', '地区'], values='销售额', aggfunc=['sum', 'max'])5、pandas处理excel文件
为文件新增一列,然后存为新文件
import pandas as pd df = pd.read_excel(r'D:\python\project\python_adv\pythonPandas\data\data1.xlsx',engine="openpyxl") # print(df.query('工资>=7000')) df["是否成年"] = df["年龄"].apply(lambda x: 1 if x >= 18 else 0) df.to_excel('./data/results.xlsx',engine="openpyxl")三、Matplotlib
数据可视化
1、Matplotlib 安装和导入
1.1 安装 Matplotlib
# 使用 pip 安装 pip install matplotlib # 使用 conda 安装 conda install matplotlib1.2 导入 Matplotlib
import matplotlib.pyplot as plt # 惯例缩写为 plt2、基本绘图功能
2.1 折线图
import numpy as np import matplotlib.pyplot as plt import matplotlib # 新版本需要指定 matplotlib 使用 TkAgg 作为图形后端来渲染和显示图 matplotlib.use("TkAgg") # 添加支持中文 plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC'] plt.rcParams['axes.unicode_minus'] = False # 主备数据 x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 5, 6, 1, 8]) # 设置显示的大小 plt.figure(figsize=(10, 5)) # 画图 plt.plot(x, y, color='yellow') # plt.bar(x, y) # 柱状图 # 添加标题 plt.title("折线图示例") # 添加x、y轴标识 plt.xlabel("x轴") plt.ylabel('Y轴') # 为图像添加网格 plt.grid() # 显示图像 plt.show()2.2 散点图
import matplotlib.pyplot as plot import matplotlib import matplotlib.pyplot as plt import numpy as np matplotlib.use('TkAgg') plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC'] plt.rcParams['axes.unicode_minus'] = False # 准备数据 np.random.seed(56) x = np.random.randn(50) y = x*2 + np.random.randn(50)*0.9 # 设置大小 plt.figure(figsize=(10,4)) # 绘图 plt.scatter(x,y,color='green') # 设置标题 plt.title("散点图示例") # 设置x、y轴 plt.xlabel("X轴") plt.ylabel("Y轴") plt.grid() # 图形显示 plt.show()四、实例——中美日GDP数据分析综合案例
单独获取中美日三个国家的各个年份的GDP数据,并绘制出折线图方便对比
import matplotlib.pyplot as plt import matplotlib import numpy as np import pandas as pd matplotlib.use("TkAgg") plt.rcParams['font.sans-serif'] = ['SimHei','Heiti TC'] plt.rcParams['axes.unicode_minus'] = True # 读取./data/1960-2019全球GDP数据.csv 文件 df = pd.read_csv('./data/1960-2019全球GDP数据.csv',sep=',',encoding='gbk') # 删除有null数据的行,并更改原df df.dropna(inplace=True) # print(df) # 数据处理 # 筛选对应数据,并复制为之后更改 df_China = df.query('country == "中国"').copy() df_America = df.query('country == "美国"').copy() df_Japan = df.query('country == "日本"').copy() # 设置年份为索引 df_China.set_index("year", inplace=True) df_America.set_index("year", inplace=True) df_Japan.set_index("year", inplace=True) # 画图 plt.figure(figsize=(10, 5)) plt.plot(df_China.index, df_China["GDP"], color='black', label='中国') plt.plot(df_America.index, df_America["GDP"], color='green', label='美国') plt.plot(df_Japan.index, df_Japan["GDP"], color='yellow', label='日本') # 添加网格、标题、x轴、y轴、图例 plt.grid() plt.legend() # 图例 plt.title("1960-2019年中美日GDP数据折线图") plt.xlabel("年份") plt.ylabel("GDP") # 显示 plt.show()