Python+大数据-数据分析与处理(四)-pandas数据处理
1. apply自定义函数
1.1 apply函数简介
pandas 的 apply()
函数可以作用于 Series
或者整个 DataFrame
,功能也是自动遍历整个 Series
或者 DataFrame
,对每一个元素运行指定的函数。
1)pandas 提供了很多数据处理的 API,但当提供的 API 不能满足需求的时候,需要自己编写数据处理函数, 这个时候可以使用 apply 函数
2)apply 函数可以接收一个自定义函数,可以将 DataFrame 的行或列数据传递给自定义函数处理
3)apply 函数类似于编写一个 for 循环,遍历行、列的每一个元素, 但比使用 for 循环效率高很多
- Series 和 DataFrame 均可以通过 apply 传入自定义函数
- DataFrame 也可通过 applymap 传入自定义函数
- 有些时候需要通过 np 的 vectorize 函数才能进行向量化计算
- lambda 表达式可用于创建一些匿名的简单函数
2. 数据分组操作
2.1 分组聚合操作
在 SQL 中我们经常使用 GROUP BY 将某个字段,按不同的取值进行分组,在 pandas 中也有 groupby 函数;
分组之后,每组都会有至少1条数据,将这些数据进一步处理返回单个值的过程就是聚合。
比如:分组之后计算算术平均值,或者分组之后计算频数,都属于聚合。
基本格式:
方式 | 说明 |
---|---|
方式1: df.groupby(列标签, ...).列标签.聚合函数() | 按指定列分组,并对分组数据 的相应列进行相应的 聚合操作 |
方式2: df.groupby(列标签, ...).agg({'列标签': '聚合', ...}) df.groupby(列标签, ...).列表签.agg(聚合...) | 按指定列分组,并对分组数据 的相应列进行相应的 聚合操作 |
方式3: df.groupby(列标签, ...).aggregate({'列标签': '聚合', ...}) df.groupby(列标签, ...).列表签.aggregate(聚合...) | 按指定列分组,并对分组数据 的相应列进行相应的聚合操作 |
注意:
1)方式1 只能使用 pandas 内置的聚合方法,并且只能进行一种聚合
2)方式2 和 方式3 除了能够使用 pandas 内置的聚合方法,还可以使用其他聚合方法,并且可以进行多种聚合
2.1.1pandas内置的聚合方法
可以与groupby
一起使用的方法和函数:
pandas方法 | Numpy函数 | 说明 |
---|---|---|
count | np.count_nonzero | 频率统计(不包含NaN值) |
size | 频率统计(包含NaN值) | |
mean | np.mean | 求平均值 |
std | np.std | 标准差 |
min | np.min | 最小值 |
quantile() | np.percentile() | 分位数 |
max | np.max | 求最大值 |
sum | np.sum | 求和 |
var | np.var | 方差 |
describe | 计数、平均值、标准差,最小值、分位数、最大值 | |
first | 返回第一行 | |
last | 返回最后一行 | |
nth | 返回第N行(Python从0开始计数) |
2.2 transform 转换
- transform 转换,需要把 DataFrame 中的值传递给一个函数, 而后由该函数"转换"数据
- aggregate(聚合) 返回单个聚合值,但 transform 不会减少数据量
2.3 分组过滤
使用 groupby 方法还可以过滤数据,调用 filter 方法,传入一个返回布尔值的函数,返回 False 的数据会被过滤掉
2.4 DataFrameGroupBy 对象
- 分组是数据分析中常见的操作,有助于从不同角度观察数据
- 分组之后可以得到 DataFrameGroupby 对象,该对象可以进行聚合、转换、过滤操作
- 分组之后的数据处理可以使用已有的内置函数,也可以使用自定义函数
- 分组不但可以对单个字段进行分组,也可以对多个字段进行分组,多个字段分组之后可以得到MultiIndex数据,可以通过 reset_index 方法将数据变成普通的 DataFrame
3. 数据透视表
3.1 透视表概述
数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。所进行的计算与数据跟数据透视表中的排列有关。
之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号、列标和页字段。每一次改变版面布置时,数据透视表会立即按照新的布置重新计算数据。另外,如果原始数据发生更改,则可以更新数据透视表。
在使用 Excel 做数据分析时,透视表是很常用的功能,pandas 也提供了透视表功能,对应的 API 为 pivot_table
pandas pivot_table 函数介绍:
方法 | 说明 |
---|---|
pd.pivot_table(df, ...) | 进行透视表操作 |
df.pivot_table(...) | 进行透视表操作 |
pivot_table 最重要的四个参数 values、index、columns、aggfunc,下面通过案例介绍 pivot_tabe 的使用
透视表实现:
- index:行索引,传入原始数据的列名
- columns:列索引,传入原始数据的列名
- values: 要做聚合操作的列名
- aggfunc:聚合函数
3.2 总结
- 透视表是数据分析中经常使用的 API,跟 Excel 中的数据透视表功能类似
- pandas 的数据透视表:pivot_table,常用几个参数 index、values、columns、aggfuc、margin
- pandas 的数据透视表功能与 groupby 功能类似
4. datatime数据类型
Python 内置了datetime 对象,可以在 datetime 库中找到
from datetime import datetime
# 获取当前时间
t1 = datetime.now()
t1
4.1 pandas中数据转换成datatime
# 查看前五行数据
ebola = pd.read_csv('./data/country_timeseries.csv')
ebola.iloc[:5, :5]
# 注:从数据中看出 Date 列是日期,但通过info查看加载后数据为object类型
ebola.info()
#可以通过 pandas 的 to_datetime方法把 Date 列转换为datetime,然后创建新列
ebola['Date_Dt'] = pd.to_datetime(ebola['Date'])
ebola.info()
#如果数据中包含日期时间数据,可以在加载的时候,通过parse_dates参数指定自动转换为 datetime
ebola = pd.read_csv('./data/country_timeseries.csv', parse_dates=[0])
ebola.info()
#可以看到得到的数据是Timestamp类型,通过Timestamp可以获取年、月、日等部分
# 通过 ebola 数据集的 Date 列,创建新列 year、month、day
ebola['year'] = ebola['Date'].dt.year
ebola['year']
ebola['month'] = ebola['Date'].dt.month
ebola['day'] = ebola['Date'].dt.day
ebola[['Date','year','month','day']].head()
4.2 总结
- pandas 中,datetime64用来表示时间序列类型
- 时间序列类型的数据可以作为行索引,对应的数据类型是DatetimeIndex类型
- datetime64类型可以做差,返回的是timedelta类型
- 转换成时间序列类型后,可以按照时间的特点对数据进行处理
- 提取日期的各个部分(月,日,星期…)
- 进行日期运算
- 按照日期范围取值