Python作为当下最为流行的编程语言之一,可以独立完成数据分析的各种任务
-
功能强大,在数据分析领域里有海量开源库,并持续更新
-
是当下热点——机器学习/深度学习 领域最热门的编程语言
-
除数据分析领域外,在爬虫,Web开发等领域均有应用
常用Python数据分析开源库介绍
NumPy
-
NumPy(Numerical Python) 是Python数据分析必不可少的第三方库,NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型,使其具备了构造复杂数据类型的能力。
-
是一个运行速度非常快的数学库,主要用于数组计算,包含:
-
高性能科学计算和数据分析的基础包
-
ndarray,多维数组,具有矢量(向量)运算能力,快速、节省空间
-
矩阵运算,无需循环,可完成类似Matlab(商业数学软件)中的矢量运算
-
用于读写磁盘数据的工具以及用于操作内存映射文件的工具
-
Pandas
-
Pandas是一个强大的分析==结构化数据==的工具集,Pandas丰富的API能够更加灵活、快速的对数据进行==清洗==、==处理==以及==分析==。
-
Pandas在数据处理上具有独特的优势:
-
底层是基于NumPy构建的,所以运行速度特别的快
-
有专门的处理缺失数据的API
-
具有强大而灵活的分组、聚合、转换功能
-
-
Pandas利器之==Series==
-
Series是一种类似于一维数据的数据结构
-
是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即行索引)组成
-
仅由一组数据也可产生简单的Series对象
-
-
Pandas利器之==DataFrame==
-
DataFrame是一种表格型的数据结构,既有行索引也有列索引,可以简单的把DataFrame理解为一张数据表
-
包含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔型等)
-
Matplotlib
-
Matplotlib 是一个功能强大的数据可视化开源Python库
-
Python中使用最多的图形绘图库
-
可以创建静态,动态和交互式的图表
Seaborn
-
Seaborn是一个Python数据可视化开源库
-
建立在matplotlib之上,并集成了pandas的数据结构
-
Seaborn通过更简洁的API来绘制信息更丰富,更具吸引力的图像
-
面向数据集的API,与Pandas配合使用起来比直接使用Matplotlib更方便
Sklearn
-
scikit-learn 是基于 Python 语言的机器学习工具
-
简单高效的数据挖掘和数据分析工具
-
可供大家在各种环境中重复使用
-
建立在 NumPy ,SciPy(Scientific Python) 和 matplotlib 上
-
Jupyter Notebook
-
Jupyter Notebook是一个开源Web应用程序,使用Jupyter Notebook可以创建和共享
-
代码
-
数学公式
-
可视化图表
-
笔记文档
-
-
Jupyter Notebook用途
-
数据清理和转换
-
统计分析
-
数据可视化
-
机器学习等
-
-
Jupyter Notebook是数据分析学习和开发的首选开发环境
-
启动Jupyter服务
-
Windows使用
1、打开命令提示符
2、安装 Jupyter Notebook:在命令提示符中输入以下命令,使用 pip 安装 Jupyter Notebook。
pip install jupyter notebook 或 pip install jupyter notebook -i https://pypi.tuna.tsinghua.edu.cn/simple
3、启动 Jupyter Notebook:在命令提示符中输入以下命令,启动 Jupyter Notebook。
jupyter notebook
4、接下来Jupyter Notebook 会在默认的浏览器中打开,如果没有自动打开,可以在浏览器中输入:
总结:
了解Python做数据分析的优势
Python可以独立高效的完成数据分析相关的全部工作
知道Python数据分析常用开源库
Pandas
Numpy
Matplotlib
Seaborn
sklearn
会启动和使用jupyter notebook
Pandas的数据结构
panads是什么
Pandas是Python的一个开源数据分析库,用作数据分析,有两个数据结构:Series、DataFrame
Series:一维数组,可以保存任何数据类型(整数、字符串、浮点数、Python对象等),Series带有索引,目前可以理解为一列数据。
DataFrame:二维表格型数据结构,可以看作是由Series组成的字典对象。DataFrame既有行索引也有列索引,它可以被看作是一个共享相同索引的多个Series对象的集合。
认识Pandas中的数据结构
上图为通过pandas读取数据集展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:
-
DataFrame
-
Series
-
索引列
-
索引名、索引值
-
索引下标、行号
-
-
数据列
-
列名
-
列下标
-
列值,具体的数据
-
-
-
其中最核心的就是Pandas中的两个数据结构:DataFrame和Series
Series对象
Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;一般是DataFrame的列对象,series本身也具有行索引。
Series是一种类似于一维数组的对象,由下面两个部分组成:
values:一组数据(numpy.ndarray类型)
index:相关的数据行索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
数据类型
Pandas的Series
数据结构可以容纳多种数据类型,以下是一些常见的数据类型:
-
整数类型 (Integer Types)
-
int8
,int16
,int32
,int64
: 这些是Pandas支持的整数类型,根据数据的范围和内存使用情况进行选择。默认情况下,整数数据通常会被存储为int64
。
-
-
浮点类型 (Floating-Point Types)
-
float16
,float32
,float64
: 这些是用于存储浮点数的类型,根据精度和内存需求来选择。默认情况下,浮点数数据通常会被存储为float64
。
-
-
对象类型 (Object Type)
-
object
: 用于存储字符串、混合类型数据或Python对象。这是非常灵活的数据类型,但可能会降低某些操作的性能。
-
-
布尔类型 (Boolean Type)
-
bool
: 用于存储布尔值(True或False)。
-
-
日期和时间类型 (Datetime Types)
-
datetime64[ns]
: 用于存储日期和时间数据,精确到纳秒。Pandas提供了丰富的日期和时间处理功能。
-
创建Series对象
通过numpy.ndarray来创建
-
自动生成索引
参考代码:
import numpy as np
import pandas as pd
# 创建numpy.ndarray对象
n1 = np.array([1, 2, 3])
print(n1)
print(type(n1))
# 创建Series对象
s1 = pd.Series(data=n1)
print(s1)
print(type(s1))
# 输出结果如下:
[1 2 3]
<class 'numpy.ndarray'>
0 1
1 2
2 3
dtype: int64
<class 'pandas.core.series.Series'>
上面的结果中,左边显示的0,1是Series的索引,默认为0,1,2,3...,下边的dtype:int64
就是该Series对象中值的数据类型
指定索引:
import numpy as np
import pandas as pd
# 创建numpy.ndarray对象
n1 = np.array([1, 2, 3])
# 创建Series对象, 同时指定索引
s1 = pd.Series(data=n1, index=['A', 'B', 'C'])
print(s1)
print(type(s1))
# 输出结果如下:
A 1
B 2
C 3
dtype: int64
<class 'pandas.core.series.Series'>
通过list列表来创建
-
如果传入的数据类型是统一的数字,那么最终的dtype类型是int64
-
如果传入的数据类型是统一的字符串,那么最终的dtype类型是object
-
如果传入的数据类型是多种类型,那么最终的dtype类型也是object
-
参考代码
-
import pandas as pd
# 创建Series对象
s1 = pd.Series(['banana', 42])
print(s1)
s2 = pd.Series(['banana', 'apple'])
print(s2)
s3 = pd.Series([50, 42])
print(s3)
# 自定义索引
s4 = pd.Series(['小明', '男'], index=['Name', 'Gender'])
print(s4)
# 输出结果如下:
0 banana
1 42
dtype: object
0 banana
1 apple
dtype: object
0 50
1 42
dtype: int64
Name 小明
Gender 男
dtype: object
通过字典或元组创建s对象
-
参考代码
import pandas as pd
# 使用元组
tuple1 = (1, 2, 3)
s1 = pd.Series(tuple1)
print(s1)
# 使用字典 字典中的key值是Series对象的索引值,value值是Series对象的数据值
dict1 = {'A': 1, 'B': 2, 'C': 3}
s2 = pd.Series(dict1)
print(s2)
# 输出结果如下
0 1
1 2
2 3
dtype: int64
A 1
B 2
C 3
dtype: int64
Series对象常用属性和方法
-
常见属性
-
属性 说明 loc 使用索引值取子集 iloc 使用索引位置取子集 dtype或dtypes Series内容的类型 T Series的转置矩阵 shape 数据的维数 size Series中元素的数量 values Series的值 -
常见方法
方法 说明 append 连接两个或多个Series corr 计算与另一个Series的相关系数 cov 计算与另一个Series的协方差 describe 计算常见统计量 drop_duplicates 返回去重之后的Series equals 判断两个Series是否相同 get_values 获取Series的值,作用与values属性相同 hist 绘制直方图 isin Series中是否包含某些值 min 返回最小值 max 返回最大值 mean 返回算术平均值 median 返回中位数 mode 返回众数 quantile 返回指定位置的分位数 replace 用指定值代替Series中的值 sample 返回Series的随机采样值 sort_values 对值进行排序 to_frame 把Series转换为DataFrame unique 去重返回数组 value_counts 统计不同值数量 keys 获取索引值 head 查看前5个值 tail 查看后5个值
import pandas as pd
# 创建s对象
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
print('=================== 常用属性 ===================')
# 查看s对象值数量,就是查看有多少行函数
print(s1.size)
# 查看s对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量
# (行数,列数),由于s对象时一维的,只显示行数,如果以后使用DataFrame来调用,则是二维的,既有行,又有列
print(s1.shape) # (6,)
# 查看s对象数据类型
print(s1.dtypes)
print(s1.dtype)
# 获取s对象的数据值, 返回numpy的ndarray数组类型
print(s1.values) # [1 2 3 4 2 3] 本质上是一个numpy 数组
print(type(s1.values)) # <class 'numpy.ndarray'>
# 获取s对象的索引
# 前边是索引值,dtype是索引值类型,这里是字符串(object)
print(s1.index) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
print('=================== 常用方法 ===================')
# 查看s对象值数量
print(len(s1))
# 查看s对象前5个值, n默认等于5
print(s1.head()) # 查询前5行数据
print(s1.head(n=2)) # 设置查询前2行数据
# 查看s对象后5个值, n默认等于5
print(s1.tail()) # 查询后5行数据
print(s1.tail(n=2)) # 设置查询后2行数据
# 获取s对象的索引
print(s1.keys()) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# s对象转换成python列表
print(s1.tolist())
print(s1.to_list()) # 作用同上
# s对象转换成DataFrame对象
print(s1.to_frame())
print(s1.to_frame().shape # (6,1) 输出是一个二维信 表格有6行1列
# s对象中数据的基础统计信息
print(s1.describe())
"""
count: 数据集中的元素数量。在这里是6。
mean: 数据集的平均值。所有数值相加后除以数值的数量。在这里是2.5。
std: 数据集的标准差。它描述了数值相对于平均值的离散程度。在这里是1.048809。
min: 数据集中的最小值。在这里是1。
25%: 数据集的四分位数(或百分位数)的第25个值。它表示有25%的数据小于或等于这个值。在这里是2。
50%: 数据集的中位数。它表示有一半的数据小于这个值,另一半大于这个值。在这里是2.5。
75%: 数据集的四分位数(或百分位数)的第75个值。它表示有75%的数据小于或等于这个值。在这里是3。
max: 数据集中的最大值。在这里是4。
"""
# s对象最大值、最小值、平均值、求和值...
print(s1.max())
print(s1.min())
print(s1.mean())
print(s1.sum())
# s对象数据值去重, 返回s对象
print(s1.drop_duplicates())
# s对象数据值去重, 返回数组
print(s1.unique())
# s对象数据值排序, 默认升序
print(s1.sort_values(ascending=True))
# s对象索引值排序, 默认升序
print(s1.sort_index(ascending=False))
# s对象不同值的数量, 类似于分组计数操作
print(s1.value_counts()) # select 数字,count(*) from 表 group by 数字;
布尔值列表获取Series数据
从
scientists.csv
数据集中,列出大于Age
列的平均值的具体值,具体步骤如下:有需要数据集资料的可以私信我
-
加载并观察数据集
import pandas as pd df = pd.read_csv('data/scientists.csv') print(df) # print(df.head()) # 输出结果如下 Name Born Died Age Occupation 0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist 1 William Gosset 1876-06-13 1937-10-16 61 Statistician 2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse 3 Marie Curie 1867-11-07 1934-07-04 66 Chemist 4 Rachel Carson 1907-05-27 1964-04-14 56 Biologist 5 John Snow 1813-03-15 1858-06-16 45 Physician 6 Alan Turing 1912-06-23 1954-06-07 41 Computer Scientist 7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematicia
计算
Age
列的平均值 -
# 获取一列数据 df[列名] ages = df['Age'] print(ages) print(type(ages)) print(ages.mean()) # 输出结果如下 0 37 1 61 2 90 3 66 4 56 5 45 6 41 7 77 Name: Age, dtype: int64 <class 'pandas.core.series.Series'> 59.125
输出大于
Age
列的平均值的具体值 -
print(ages[ages > ages.mean()]) # 输出结果如下 1 61 2 90 3 66 7 77 Name: Age, dtype: int64
在本例中,
ages>ages.mean()
,到底是什么?为什么
ages[ages > ages.mean()]
就能返回我们想要的结果?
利用表达式 ages > ages.mean()
,获取布尔值构成的series对象
new_ages_s = ages > ages.mean()
print(new_ages_s) # series对象
print(new_ages_s.values) # numpy的ndarray数据类型
print(list(new_ages_s.values)) # python的list数据类型
# 输出结果如下
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 True
Name: Age, dtype: bool
[False True True True False False False True]
[False, True, True, True, False, False, False, True]
从Series中获取部分数据,可以传入布尔值的列表
bool_list = list(new_ages_s.values) # 构造布尔值列表
print(ages[bool_list]) # 通过布尔索引来控制,输出指定范围
# 输出结果如下
1 61
2 90
3 66
7 77
Name: Age, dtype: int64
Series对象的运算
Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算;
两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充。
-
Series和数值型变量计算
-
# 加法 print(ages + 10) # 乘法 print(ages * 2) # 输出结果如下 0 47 1 71 2 100 3 76 4 66 5 55 6 51 7 87 Name: Age, dtype: int64 0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充
-
print(ages + ages) print('=' * 20) print(pd.Series([1, 100])) print('=' * 20) print(ages + pd.Series([1, 100])) # 输出结果如下 0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64 ==================== 0 1 1 100 dtype: int64 ==================== 0 38.0 1 161.0 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN dtype: float64
DataFrame对象
DataFrame是一个表格型的==结构化==数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。
-
DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引
-
DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用
创建DataFrame对象
DataFrame的创建有很多种方式:
-
Serires对象转换为df:上一小节中学习了
s.to_frame()
-
读取文件数据返回df:上一小节中我们使用了
pd.read_csv('csv格式数据文件路径')
的方式获取了df对象 -
使用字典、列表、元组创建df
-
-
使用字典加列表创建df
import pandas as pd
dict_data = {
'id': [1, 2, 3],
'name': ['张三', '李四', '王五'],
'age': [18, 20, 22]
}
# 使用默认自增索引
# 字典中的key值是df对象的列名,value值是对应列的数据值
df1 = pd.DataFrame(data=dict_data)
print(df1)
print(type(df1))a
# 通过index参数指定索引, columns参数指定列的位置
df2 = pd.DataFrame(data=dict_data, index=['A', 'B', 'C'], columns=['id', 'age', 'name'])
print(df2)
# 输出结果如下
id name age
0 1 张三 18
1 2 李四 20
2 3 王五 22
<class 'pandas.core.frame.DataFrame'>
id age name
A 1 18 张三
B 2 20 李四
C 3 22 王五
使用列表加元组创建df,并自定义索引
list_data = [(1, '张三', 18),
(2, '李四', 20),
(3, '王五', 22)]
df3 = pd.DataFrame(data=list_data,
index=['A', 'B', 'C'], # 手动指定索引
columns=['id', 'name', 'age']) # 手动指定列名
print(df3)
# 输出结果如下
id name age
A 1 张三 18
B 2 李四 20
C 3 王五 22
DataFrame对象常用属性和方法
DataFrame对象常用属性和方法与Series对象的几乎相同
import pandas as pd
# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
print('=============== 常用属性 ===============')
# 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数
print(df.shape)
# 查看数据值个数, 行数*列数, NaN值也算
print(df.size)
# 查看数据值, 返回numpy的ndarray类型
print(df.values)
# 查看维度数
print(df.ndim)
# 返回列名和列数据类型
print(df.dtypes)
# 查看索引值, 返回索引值对象
print(df.index)
# 查看列名, 返回列名对象
print(df.columns)
print('=============== 常用方法 ===============')
# 查看前5行数据
print(df.head())
# 查看后5行数据
print(df.tail())
# 查看df的基本信息
df.info()
# 查看df对象中所有数值列的描述统计信息
print(df.describe())
# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列
print(df.describe(exclude=['int', 'float']))
# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型
print(df.describe(include='all'))
# 查看df的行数
print(len(df))
# 查看df各列的最小值
print(df.min())
# 查看df各列的非空值个数
print(df.count())
# 查看df数值列的平均值
print(df.mean())
布尔值列表获取DataFrame对象中部分数据
-
同Series一样,DataFrame也可以使用布尔值Series对象获取数据子集
# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
print(df['Age'] > df['Age'].mean())
print(df[df['Age'] > df['Age'].mean()])
# 输出结果如下
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 True
Name: Age, dtype: bool
Name Born Died Age Occupation
1 William Gosset 1876-06-13 1937-10-16 61 Statistician
2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse
3 Marie Curie 1867-11-07 1934-07-04 66 Chemist
7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician
本质就是传入布尔值构成的列表,来获取部分数据,True所对应的数据会被保留
# 获取第1、2、4、8行数据
# 布尔值列表个数要和df的行数相同
bool_list = [True, True, False, True, False, False, False, True]
print(df[bool_list])
# 输出结果如下
Name Born Died Age Occupation
0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist
1 William Gosset 1876-06-13 1937-10-16 61 Statistician
3 Marie Curie 1867-11-07 1934-07-04 66 Chemist
7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician
DataFrame对象的运算
DataFrame和数值型变量计算时,变量会与DataFrame中的每个元素逐一进行计算,但df中存在非数值类型列时不能进行加减除运算;
两个DataFrame之间、以及df和s对象进行计算时,索引值相同的行之间会进行计算;索引值不同的行的计算结果会用NaN值(缺失值)填充。
-
df和数值型变量计算
import pandas as pd
# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
print(df * 2)
# print(df + 2) # 报错,因为df2中有非数值类型的列
# 输出结果如下 数值类型列的值和数值变量正常运算, 非数值类型列的值重复拼接在一起
df之间进行运算
print(df + df) # 输出结果和 df * 2 相同
# isin:判断df的索引值是否在values参数列表中, 返回布尔值的ndarray数据类型
print(df.index.isin(values=[0, 2, 4]))
df2 = df[df.index.isin(values=[0, 2, 4])]
print(df2)
print(df + df2)
总结
Pandas中的API太多,千万不要尝试去记忆,你记不住的,要求有印象、能找到、能看懂
-
理解类知识点
-
dataframe和series对象是什么:
-
可以认为df是有行有列有索引的二维数据表
-
df和s是Pandas中最核心的数据结构
-
df中每一列或者每一行都是s对象
-
s对象也有索引
-
每一个s对象都有各自的数据类型,表示构成这个s对象中的值的type;常用的数据类型有
-
Object -- 字符串
-
int -- 整数
-
float -- 小数
-
-
-
-
series和dataframe的API
# <s/df>表示s对象或df对象
<s/df>.size # 返回数据个数
<s/df>.shape # s返回(行数,),df返回(行数,列数)
<s/df>.dtypes # s返回数据类型,df返回列名和该列数据的类型
<s/df>.values # 返回全部值
<s/df>.index # 查看索引
<s/df>.head() # s返回前5个数据,df返回前5行数据
<s/df>.tail() # s返回后5个数据,df返回后5行数据
df.info() # 返回df的基本信息:索引情况,以及各列的名称、数据数量、数据类型;s对象没有这个函数
<s/df>.describe() # 返回s或df对象中所有数值类型数据的基础统计信息
df.describe(include='all') # 返回df对象中全部列数据的基础统计信息
-
series以及dataframe的运算
-
当s或df和数值进行运算时,每一个具体的值会分别和数值进行运算,但s或df中的数据存在非数值类型时不能做加减除法运算
-
两个s之间、两个df之间,以及df和s对象进行计算,会根据索引的值进行对应计算,当两个对象的索引值不能对应时,不匹配的会返回NaN
-
-
判断表达式
-
s对象的判断表达式返回由布尔值构成的numpy.ndarray数组
-
布尔值列表或数组获取s或df对象中部分数据的方法:返回True对应的(行)数据
-