Numpy能够帮助我们处理数值型数据,但是这还不够,我们的数据除了数值以外,还有字符串还有时间序列等等,所以pandas出现了。pandas是一个强大的分析结构话数据的工具集,基于Numpy构建,提供了高级数据结构和数据操作工具,是使Python成为强大而高效的数据分析环境的重要因素之一
- 一个强大的分析和操作大型结构化数据集所需的工具集
- 基础是numpy,提供了高性能矩阵的运算
- 提供了大量能够快速便捷地处理数据的函数和方法
- 应用于数据挖掘,数据分析
- 提供数据清洗功能
详细pandas内容可前往pandas官方网站进行学习。
pandas数据结构
为了入门pandas,需要熟悉两个常用的工具数据结构:Series和DataFrame。尽管它们并不能解决所有问题,但它们为大多数应用提供了一个有效、易用的基础。
Series
Series是一种一维的数组型对象,包含一个值序列,并且包含了数据标签(index)。
1 | import pandas as pd |
Series的基本用法包括
- isnull notnull 检查缺失值
- 通过索引获取数据
- 数据对齐:在数学操作中自动对齐索引
- Series的name属性
1 | import pandas as pd |
DataFrame
DataFrame是表示矩阵的数据表,它包含已排序的列集合,每一列可以是不同的数据类型。DataFrame有行索引也有列索引,数据被存储为一个以上的二维块。后续可以利用分层索引在DataFrame中展现更高维度的数据。
常用的构建DataFrame的方式是利用Numpy数组的字典或包含等长度列表。
通过字典创建DataFrame
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
26import pandas as pd
import numpy as np
def prints(a):
print(a)
print('='*30)
# 字典类:
# 数组、列表或元组构成的字典构造dataframe
data1 = {'a':[1,2,3,4],'b':[5,6,7,8],'c':np.arange(9,13)}
frame1 = pd.DataFrame(data1)
prints(frame1)
prints(frame1.index) # 行索引
prints(frame1.columns) # 列索引
prints(frame1.values) # 值
frame2 = pd.DataFrame(data1,index=['A','B','C','D'],columns=['a','v','c','d'])
prints(frame2)
# Series构成的字典构造dataframe
frame3 = pd.DataFrame({'a':pd.Series(np.arange(3)),'b':pd.Series(np.arange(3,5))})
prints(frame3)
# 字典构成的字典构造dataframe
data2 = {
'a':{'apple':3.6,'banana':'5.6'},
'b':{'apple':3.6,'banana':'5.6'},
'c':{'apple':3.6}
}
frame4 = pd.DataFrame(data2)
prints(frame4)通过列表创建DataFrame
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import pandas as pd
import numpy as np
def prints(a):
print(a)
print('='*30)
# 列表类
# 2D ndarray构造dataframe
arr1 = np.arange(12).reshape(4,3)
prints(arr1)
frame1 = pd.DataFrame(arr1,index=['a','b','c','d'],columns=['A','B','C'])
prints(frame1)
# 字典构成的列表构造dataframe
list1 = [{'apple':3.6,'banana':5.6},{'apple':3,'banana':5},{'apple':3.2}]
frame2 = pd.DataFrame(list1,index=['a','b','c'])
prints(frame2)
# Series构成的列表构造dataframe
list2 = [pd.Series(np.random.rand(3)),pd.Series(np.random.rand(2))]
frame3 = pd.DataFrame(list2)
prints(list2)
prints(frame3)DataFrame构造函数的有效输入
类型 描述 2D ndarray 数据的矩阵,行和列标签是可选参数 数组、列表和元组构成的字典 每个序列成为DataFrame的一列,所有的序列必须长度相等 Numpy结构化数组 与数组构成的字典一致 Series构成的字典 每个值成为一列,每个Series的索引形成行索引,也可以显式地传递索引 字典构成的字典 每个内部字典成为一列,字典的键形成行索引, 字典或Series构成的列表 列表中的一个元素形成DataFrame的一行,字典键或Series索引形成列标签 列表或元组构成的列表 与2D ndarray一致 其他DataFrame 如果不显示传递索引,则会使用原DataFrame索引 Numpy MaskedArray 与2D ndarray类似,但隐蔽值会在结果DataFrame中成为缺失值
DataFrame的基本使用
1 | import pandas as pd |
索引对象
索引对象是用于存储轴标签和其他元数据的,索引对象不可变,保证了数据的安全。
1 | import pandas as pd |
与Python集合不同,pandas索引对象可以包含重复标签,根据重复标签进行筛选,会选取所有重复标签对应的数据。下表总结了一些索引集合逻辑的方法和属性:
| 方法 | 描述 |
|---|---|
| append | 将额外的索引对象粘贴到原索引后,产生一个新的索引 |
| difference | 计算两个索引的差集 |
| intersection | 计算两个索引的交集 |
| union | 计算两个索引的并集 |
| isin | 计算表示每一个值是否在传值容器中的布尔数值 |
| delete | 将位置i的元素删除,并产生新的索引 |
| drop | 根据传参删除置顶索引值,并产生新的索引 |
| insert | 在位置i插入元素,并产生新的索引 |
| is_monotonic | 如果索引序列递增,则返回True |
| is_unique | 如果索引序列唯一,则返回True |
| unique | 计算索引的唯一值序列 |
pandas基本功能
重点了解Series和DataFrame中数据交互的基础机制。
重建索引
reindex方法用于创建一个符合新索引的新对象
1 | import pandas as pd |
reindex方法的参数:
| 方法 | 描述 |
|---|---|
| index | 新建作为索引的序列 |
| method | 插值方式:’ffill’为前向填充,’bfill’为后向填充 |
| fill_value | 通过重新索引引入缺失数据时使用替代值 |
| limit | 前向/后向填充时,所需填充的最大尺寸间隙(元素数量) |
| tolerance | 前向/后向填充时,所需填充的不精确匹配下的最大尺寸间隙(绝对值距离) |
| level | 匹配MultiIndex级别的简单索引 |
| copy | True时,总是复制底层数据;False时,在索引相同时不复制数据 |
索引操作
pandas索引操作与Numpy数组索引的功能类似,但pandas的索引值可以不仅仅是整数,简单来说可以分为增删改查四种基本操作。
增
append函数和insert函数
1 | import pandas as pd |
删
del函数和drop函数
1 | import pandas as pd |
改
1 | import pandas as pd |
查
1 | import pandas as pd |
高级索引
当对一个包含整数轴索引的DataFrame对象进行索引操作时,标签索引和位置索引的表达方式是很类似的,未避免将来引起歧义,数据选择时建议始终使用标签索引,为更精确地处理,可以使用loc(用于标签)或iloc(用于整数位置)进行索引。
1 | import pandas as pd |
下表总结了DataFrame不同的索引选项:
| 类型 | 描述 |
|---|---|
| df[val] | 从DataFrame中选择单列或列序列 |
| df.loc[val] | 根据标签选择单行或多行 |
| df.loc[ : , val] | 根据标签选择单列或多列 |
| df.loc[val1, val2] | 同时选择行和列的一部分 |
| df.iloc[where] | 根据整数位置选择单行或多行 |
| df.iloc[ : , where] | 根据整数位置选择单列或多列 |
| df.iloc[where_i, where_j] | 根据整数位置选择行和列 |
| df.at[label_i, label_j] | 根据行、列标签选择单个标量值 |
| df.iat[i, j] | 根据行、列整数位置选择单个标量值 |
| reindex | 通过标签选择行或列 |
| get_value, set_value | 根据行和列的标签设置单个值 |
算术和数据对齐
不同索引对象之间的算术行为是pandas提供给一些应用的重要特性之一。如果某个索引对不相同,则返回结果的索引将是索引对的并集,类似于索引标签的自动外连接(outer join)
1 | import pandas as pd |
使用填充值的算术运算
在两个不同的索引对象之间进行算术操作时,可能想要使用特殊填充值,可以利用算术方法实现:
1 | import pandas as pd |
DataFrame和Series的混合运算
DataFrame和Series之间的算术操作与Numpy中不同维度数组间的操作类似,Series的索引会和DataFrame的列/行进行匹配,并广播到各行/列:
1 | import pandas as pd |
函数应用与映射
利用DataFrame中的apply和applymap方法可以将常用的一些函数应用到一行或一列的一维数组上:
1 | import pandas as pd |
大部分最常用的数据统计(比如sum和mean)都是DataFrame的方法,因此计算统计值时使用apply并不是必须的,传递给apply的函数并不一定要返回一个标量值,也可以返回带有多个值的Series。
排序与排名
根据某些准则对数据集进行排序是另一个重要的内建操作,需要掌握sort_index和sort_values
1 | import pandas as pd |
排名是指对数组从1到有效数据点总数分配名次的操作,需要掌握rank方法。
1 | import pandas as pd |
排名中的平级关系打破方法:
| 方法 | 描述 |
|---|---|
| ‘average’ | 默认:在每个组中分配平均排名 |
| ‘min’ | 对整个组使用最小排名 |
| ‘max’ | 对整个组使用最大排名 |
| ‘first’ | 按照值在数据中出现的次序分配排名 |
| ‘dense’ | 类似于method='min',但组间排名总是增加1,而不是一个组中的相等元素数量 |
含有重复标签的轴索引
pandas中并不强制索引标签是唯一的,索引的is_unique属性可以查看标签是否唯一:
1 | import pandas as pd |
描述性统计概述与计算
pandas对象装配了一个常用数学、统计学方法的集合,其中大部分属于归约或汇总统计的类别,它们从DataFrame的行或列中抽取一个Series或一系列值的单个值(比如总和或平均值),这些函数内建了处理缺失值的功能。
处理缺失值
1 | import pandas as pd |
层级索引
1 | import pandas as pd |
归约方法与积累型方法
1 | import pandas as pd |
描述性统计和汇总统计方法汇总:
| 方法 | 描述 |
|---|---|
| count | 非NA值的个数 |
| describe | 计算各列的汇总统计集合 |
| min, max | 计算最小值、最大值 |
| argmin, argmax | 分别计算最小值、最大值所在的索引位置 |
| idxmin, idxmax | 分别计算最小值、最大值所在的索引标签 |
| quantile | 计算样本的从0到1间的分位数 |
| sum | 加和 |
| mean | 平均数 |
| median | 中位数(50%分位数) |
| mad | 平均值的平均绝对偏差 |
| prod | 所有值的积 |
| var | 值的样本方差 |
| std | 值的样本标准差 |
| skew | 样本偏度值(第三时刻) |
| kurt | 样本峰度值(第四时刻) |
| cumsum | 累积和 |
| cummin, cummax | 累积和的最小值或最大值 |
| cumprod | 累积积 |
| diff | 计算第一个算术差值(对时间序列有用) |
| pct_change | 计算百分比 |
相关性和协方差
相关性和协方差的方法:
| 方法 | 描述 |
|---|---|
| corr | 重叠的、非NA的、按索引对齐的值的相关性 |
| corrwith | 计算两个对象的相关性 |
| cov | 重叠的、非NA的、按索引对齐的值的协方差 |
| covwith | 计算两个对象的协方差 |
唯一值、计数与成员属性
唯一值、计数和集合成员属性的方法:
| 方法 | 描述 |
|---|---|
| isin | 计算表征Series中每个值是否包含于传入序列的布尔值数组 |
| match | 计算数组中每个值的整数索引,形成一个唯一值数组。有助于数据对齐和join类型的操作 |
| unique | 计算Series值中的唯一值数组,按照观察顺序返回 |
| value_counts | 返回一个Series,索引是唯一值序列,值是计数个数,按照个数降序排序 |
计算DataFrame多个相关列的直方图,可参考下面的例子:
1 | data = pd.DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]}) |
补充知识点
数学期望:如果X是离散的随机变量,输出值为x1,x2,…,xn,和输出值相应的概率为p1,p2,…,pn(概率和为1),那么期望值E(X)=x1 * p1 + x2 * p2 + … + xn * pn
假设有X和Y两个随机变量,它们的均值(期望值)是μX ,μY,它们的标准差是σX以及σY,E代表求数学期望,它们的协方差和相关性可以通过以下式子计算
协方差:covariance σXY=E[(X−μX)(Y−μY)],表示的是两个变量的总体的误差
相关性:correlation ρXY=E[(X−μX)(Y−μY)]/(σXσY),表示的是两个变量的相关性
以上数学概念详细公式可参考协方差百度百科。
lambda表达式:Lambda表达式是Python中一类特殊的定义函数的形式,使用它可以定义一个匿名函数。语法如下:
lambda 形参列表 : 函数返回值表达式语句
具体语法可参考以下实例:
1 | li=[{"age":20,"name":"def"},{"age":25,"name":"abc"},{"age":10,"name":"ghi"}] |
今日も一日、頑張るぞう!💪