文章目录
- 7.1 pandas 常用数据类型
- 7.1.1 一维数组与常用操作
- 7.1.1.1 创建 Series
- 7.1.1.2 修改指定索引对应的值
- 7.1.1.3 对所有数据求绝对值
- 7.1.1.4 对所有数据加 5
- 7.1.1.5 对每行索引加前缀
- 7.1.1.6 对每行索引加后缀
- 7.1.1.7 数组数据的直方图
- 7.1.1.8 获取最大值的索引
- 7.1.1.9 测试数组的值是否在指定区间内
- 7.1.1.10 查看数组中 90 分以上的数据
- 7.1.1.11 获取数组的中值
- 7.1.1.12 查看数组中大于中值的数据
- 7.1.1.13 数组与数字之间的运算
- 7.1.1.14 获取数组中最小的 2 个值
- 7.1.1.15 两个 Series 对象之间的运算
- 7.1.1.16 pipe 实现函数链式调用
- 7.1.1.17 apply 对 Series 的值进行函数运算
- 7.1.1.18 标准差、无偏方差、无偏标准差
- 7.1.1.19 查看是否`存在`等价于 True 的值
- 7.1.1.20 查看是否`所有值`都等价于 True
- 7.1.2 时间序列与常用操作
- 7.1.3 二维数组 DataFrame
- 7.2 DataFrame 数据处理与分析实战
- 7.2.1 测试数据
- 7.2.2 读取数据
- 7.2.3 设置列对齐
- 7.2.4 筛选符合特定条件的数据
- 7.2.5 查看数据特征和统计信息
- 7.2.6 按照不同标准对数据排序
- 7.2.7 使用分组与聚合对员工业绩进行汇总
- 7.2.8 处理超市交易数据中的异常值
- 7.2.9 处理超市交易数据中的缺失值
- 7.2.10 处理超市交易数据中的重复值
- 7.2.11 使用数据差分查看员工业绩波动情况
- 7.2.12 使用透视表查看业绩汇总数据
- 7.2.13 使用交叉表查看业绩汇总数据
- 7.2.14 使用重采样技术按时间段查看员工业绩
- 7.2.15 多索引相关技术与操作
- 7.2.16 使用标准差与协方差分析员工业绩
- 7.2.17 使用pandas的属性接口实现高级功能
- 7.2.18 绘制各员工在不同柜台业绩平均值的柱状图
- 7.2.19 数据拆分与合并
- 其他文章
7.1 pandas 常用数据类型
常用的数据结构
Series 带标签的一维数组
DatetimeIndex 时间序列
DataFrame 带标签且大小可变的二维表格结构
Panel 带标签且大小可变的三维数组
7.1.1 一维数组与常用操作
Series 是 pandas 提供的一维数组,由索引和值两部分组成,是一个类似于字典的结构
7.1.1.1 创建 Series
# 1. 通过 range 对象或列表创建,使用默认索引
s1 = pandas.Series(range(1, 20, 5))
# 2. 通过字典创建,使用键作为索引
s2 = pandas.Series({'语文':90, '数学':93, 'Python':92, '物理':91})
7.1.1.2 修改指定索引对应的值
s1[3] = -17
s2['语文'] = 94
7.1.1.3 对所有数据求绝对值
abs(s1)
7.1.1.4 对所有数据加 5
s1 + 5
7.1.1.5 对每行索引加前缀
# 0 -> 20
# 1 -> 21
# 2 -> 22
# . . .
# . . .
# . . .
s1.add_prefix(2)
7.1.1.6 对每行索引加后缀
# 语文 -> 语文_张三
# 数学 -> 数学_张三
# Python -> Python_张三
# 物理 -> 物理_张三
s1.add_suffix('_张三')
7.1.1.7 数组数据的直方图
s2.hist()
matplotlab.show()
7.1.1.8 获取最大值的索引
s2.argmax()
7.1.1.9 测试数组的值是否在指定区间内
# 返回一个元素为 boolean 类型的 Series
s2.between(90, 94, inclusive=True)
7.1.1.10 查看数组中 90 分以上的数据
s2[s2>90]
7.1.1.11 获取数组的中值
s2.median()
7.1.1.12 查看数组中大于中值的数据
s2[s2>s2.median()]
7.1.1.13 数组与数字之间的运算
# 先对数组中所有数据开平方,然后扩大 10 倍,对结果四舍五入后保留一位小数
round((s2**0.5)*10, 1)
7.1.1.14 获取数组中最小的 2 个值
s2.nsmallest(2)
7.1.1.15 两个 Series 对象之间的运算
只有两个等长的 Series 对象之间可以进行四则运算和幂运算,并且只对两个 Series 对象中都有的索引对应的值进行运算,非共同索引对应的值为控制 NaN
7.1.1.16 pipe 实现函数链式调用
s2.pipe(lambda x:x+3).pipe(lambda x:x*3)
7.1.1.17 apply 对 Series 的值进行函数运算
s2.apply(lambda x:x+3)
7.1.1.18 标准差、无偏方差、无偏标准差
s2.std()
s2.var()
s2.sem()
7.1.1.19 查看是否存在
等价于 True 的值
any(s2)
7.1.1.20 查看是否所有值
都等价于 True
all(s2)
7.1.2 时间序列与常用操作
7.1.2.1 date_range() 创建时间序列
date_range(start=None, end=None, periods=None, freq=‘D’)
常用参数
start=None 指定起始日期
end=None 指定结束日期
periods=None 指定产生的数据数量
freq='D' 指定间隔,D(天), W(周), H(小时), M(月末最后一天), MS(月初第一天), T(分钟), A(年末最后一天), AS(年初第一天)
7.1.2.2 使用时间序列做索引,创建 Series 对象
pandas.Series(index, data)
常用参数
index 用于指定索引
data 用于指定数据
import pandas as pd
data = pd.Series(index=pd.date_range(start='20190701', periods=24, freq='H'), data=range(24))
7.1.2.3 操作使用时间序列做索引的 Series 对象
7.1.2.3.1 切片取数据
data[:5]
7.1.2.3.2 三分钟重采样并计算均值
data.resample('3H').mean()
7.1.2.3.3 五小时重采样并求和
data.resample('3H').sum()
7.1.2.3.4 五小时重采样并统计 OHLC 值
# OHLC 表示 OPEN(第一个数)、HIGH(最大的数)、LOW(最小的数)、CLOSE(最后的数)
data.resample('3H').ohlc()
7.1.2.3.5 替换索引
# 索引中的所有日期加一天
data.index = data.index + pd.Timedelta('1D')
7.1.2.4 Timestamp
7.1.2.4.1 创建 Timestamp 对象
day = pd.Timestamp('20190323')
7.1.2.4.2 查看指定日期是周几
day.weekday_name
7.1.2.4.3 查看指定日期时间所在年是否是闰年
pd.Timestamp('201903230800').is_leap_year
7.1.2.4.4 查看指定日期所在的季度和月份
day.quarter, day.month
7.1.2.4.5 转化为 Python 的日期时间对象
day.to_pydatetime()
7.1.3 二维数组 DataFrame
7.1.3.1 布局结构
7.1.3.2 创建 DataFrame
7.1.3.2.1 普通参数作为索引的 DataFrame
pd.DataFrame(np.random.randint(1, 20, (5, 3)),
index=range(5),
columns=['A', 'B', 'C'])
7.1.3.2.2 时间序列作为索引的 DataFrame
pd.DataFrame(np.random.randint(5, 15, (13, 3)),
index=pd.date_range(start='201907150900',
end='201907152100',
freq='H'),
columns=['熟食', '化妆品', '日用品'])
7.1.3.2.3 使用字典创建 DataFrame
# 字典的键会作为列名
pd.DataFrame({'语文':[22,23,56,78],
'数学':[45,13,76,78],
'英语':[23,28,24,96]},
index=['张三', '李四', '王五', '赵六']
7.1.3.2.4 创建 DataFrame 时自动扩充数据
# 未指定 index,使用默认索引,键作为 columns,第一列有 5 个值,第二列只有 1 个值,自动对 B 列进行扩充,使其与 A 列数据一样多
pd.DataFrame({'A':range(5), 'B':3})
7.2 DataFrame 数据处理与分析实战
7.2.1 测试数据
7.2.2 读取数据
read_excel(io, sheetname=0, header=0, skiprows=None, index_col=None, names=None, thousands=None, usecols, na_values=None)
常用参数
io : 指定要读取的文件,可以是字符串形式的文件路径、url 或文件对象
sheetname :指定读取的 worksheet,可以是表示 worksheet 序号的整数或表示 worksheet 名字的字符串;如果要同时读取多个 worksheet 可以使用形如 [0, 1, 'sheet3'] 的列表;如果指定为 None 则表示读取所有 worksheet 并返回包含多个 DataFrame 结构的字典,默认读取第一个 worksheet 中的数据
header : 指定 worksheet 列名,默认使用第 0 行;如果指定为 None 则使用数字作为表头
skiprows : 指定要跳过的行的索引组成的列表
index_col : 指定作为行索引的列下标,可以是包含若干下列表的列表
names : 指定列名
thousands : 指定文本转换为数字时的千分符;如果 Excel 中有以文本形式存储的数字,可以使用该参数
usecols : 指定要读取的列的索引或名字,多个列用列表
na_values : 指定哪些值被解释为缺失值
7.2.3 设置列对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
7.2.4 筛选符合特定条件的数据
7.2.4.1 对行进行切片
注:切片操作左闭右开
注:先取列,后取行
注:先取行,后取列
7.2.4.2 iloc 使用数字做索引
7.2.4.3 loc 和 at 使用标签文本做索引
loc 可以用来索引多行或多列数据
at 不能用来索引多行或多列数据
7.2.4.4 其他操作
-
DataFrame 可以 bool 类型 Series 作为索引
-
对数据求和
7.2.5 查看数据特征和统计信息
7.2.5.1 查看所有列的统计信息
7.2.5.2 查看指定列的统计信息
数值列
非数值列
7.2.5.3 查看四分位数
7.2.5.4 查看中值
7.2.5.5 查看指定数量的最小记录
7.2.5.6 查看指定数量的最大记录
7.2.5.7 查看最大值
7.2.5.8 查看最小值
7.2.5.9 查看最大值的行下标
7.2.5.10 查看最小值的行下标
7.2.6 按照不同标准对数据排序
7.2.6.1 sort_index
根据行索引或列名排序
sort_index(axis=0, ascending=True, inplace=False)
常用参数
axis : 0 表示按照行索引排序,1 表示按照列名排序
ascending : True 表示升序排序,False 表示降序排序
inplace : True 表示原地排序,False 表示返回一个新的 DataFrame
扩展:汉字的 Unicode 编码通过内置函数 ord() 查看
7.2.6.2 sort_values
根据值排序
sort_values(by, ascending=True, na_position='last')
常用参数
by : 指定排序依据的一个列或多个列(多个列以列表形式给出)
ascending : True 表示升序排序,False 表示降序排序;可以通过传入 bool 列表(长度与 by 指定的列表长度相等)为不同的列指定不同的顺序
na_position : last 表示把缺失值放在最后面,first 表示把缺失值放在最前面
7.2.7 使用分组与聚合对员工业绩进行汇总
聚合:对分组后的每一组数据再次调用聚合函数,包括求和、求均值、求中值等
groupby(by=None, axis=0, as_index=True, squeeze=False)
常用参数
by : 指定作为分组依据的列名(一个或多个)或行索引(函数、字典、Series 对象)
axis : 0 表示按照行索引分组,1 表示按照列名分组
as_index : True 表示用来分组的列中的数据作为结果 DataFrame 的行索引,False 表示用来分组的列中的数据不作为结果 DataFrame 的行索引
squeeze : True 表示在可能的情况下降低结果对象的维度
首先将行索引的每个值传入 lambda 表达式,再按照处理之后的数据进行分组,然后进行聚合
当参数 by 的值为字典时
对不同的列可以采用不同的函数,通过 aggregate 指定聚合的方式
使用 agg() 方法可以直接对指定列进行聚合
使用 agg() 方法对分组结果进行聚合
7.2.8 处理超市交易数据中的异常值
异常值:严重超出正常范围的数值
处理方法:确定正常范围,根据实际情况对异常值进行调整
7.2.9 处理超市交易数据中的缺失值
dropna(axis=0, how='any', thresh=None, subset=None)
常用参数
axis : 0 表示按照行索引删除,1 表示按照列名删除
how : any 表示只要某行包含缺失值就丢弃,all 表示某行全部为缺失值才丢弃
thresh : 用来指定保留包含几个非缺失值数据的行
subset : 用来指定在判断缺失值时只考虑哪些列
首先,判断数据中是否含缺失值
然后,筛选出含有缺失值的行
注:df['交易额'] 与 df.交易额 在功能上等价
在对缺失值处理之前,复制一份数据,以免接下来的操作影响原来的数据
处理缺失值
查看处理后的结果
fillna(value=None, method=None, limit=None, inplace=False)
常用参数
value : 指定要替换的值,可以是标量、字典、Series 或 DataFrame
method : 指定填充缺失值的方式,pad 或 ffill 表示使用扫描过程中遇到的最后一个有效值一直填充到下一个有效值;backfill 或 bfill 表示使用缺失值之后遇到的第一个有效值填充前面遇到的所有连续缺失值
limit : 指定设置了参数 method 时最多填充多少个连续的缺失值
inplace : True 表示原地排序,False 表示返回一个新的 DataFrame
还可以使用 fillna() 方法填充缺失值
7.2.10 处理超市交易数据中的重复值
duplicated(subset=None, keep='first')
常用参数
subset : 指定判断不同行数据是否重复时依据的一列或多列,默认使用整行所有列的数据进行比较
keep : 'first' 表示重复数据的第一次出现标记为 False;'last' 表示重复数据的最后一次出现标记为 False;False 表示标记所有重复数据为 True
首先获取重复值
进一步获取重复值
drop_duplicates(subset=None, keep='first', inplace=False)
常用参数
subset : 指定判断不同行数据是否重复时依据的一列或多列,默认使用整行所有列的数据进行比较
keep : 'first' 表示重复数据的第一次出现标记为 False;'last' 表示重复数据的最后一次出现标记为 False;False 表示标记所有重复数据为 True
inplace : True 表示原地排序,False 表示返回一个新的 DataFrame
处理重复值
此外,可以查看是否有录入错误的工号和姓名
7.2.11 使用数据差分查看员工业绩波动情况
diff(periods=1, axis=0)
常用参数
periods : 指定差分的跨度,periods=1 且 axis=0 表示每一行数据减去紧邻的上一行数据;periods=2 且 axis=0 表示每一行减去上面第二行的数据,结果作为新的 DataFrame 中的一项
axis : 0 按行进行纵向差分;1 按列进行横向差分
7.2.12 使用透视表查看业绩汇总数据
透视表用来根据一个或多个键进行聚合,把数据分散到对应的行和列上去,是数据分析常用技术之一。
pivot(index=None, columns=None, values=None)
常用参数
index : 指定使用哪一列数据作为结果 DataFrame 的索引
columns : 指定使用哪一列数据作为结果 DataFrame 的列名
values : 指定使用哪一列数据作为结果 DataFrame 的值
可以对透视表进一步进行操作
pivot_table(index=None, columns=None, values=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All', dropna=True)
常用参数
index : 指定使用哪一列数据作为结果 DataFrame 的索引
columns : 指定使用哪一列数据作为结果 DataFrame 的列名
values : 指定使用哪一列数据作为结果 DataFrame 的值
aggfunc : 指定数据的聚合方式
fill_value : 指定把透视表中的缺失值替换为什么值
margins : 指定是否显示边界以及边界上的数据
margins_name : 指定边界数据的索引名称和列名
dropna : 指定是否丢弃缺失值
margin=True 会在结果中多加一行和一列
7.2.13 使用交叉表查看业绩汇总数据
交叉表是一种特殊的透视表,往往用来统计频次,也可以使用参数 aggfunc 指定聚合函数实现其他功能。
crosstab(index, columns, values=None, aggfunc=None, rownames=None, colnames=None)
常用参数
index : 指定使用哪一列数据作为结果 DataFrame 的索引
columns : 指定使用哪一列数据作为结果 DataFrame 的列名
values : 指定使用哪一列数据作为结果 DataFrame 的值
aggfunc : 指定聚合函数,默认为统计次数
rownames : 指定行索引的名字,如果不指定,直接使用参数 index 指定的列名
colnames : 指定列索引的名字,如果不指定,直接使用参数 columns 指定的列名
7.2.14 使用重采样技术按时间段查看员工业绩
前提:保证 index 为日期时间型数据
resample(rule, how=None, label=None, on=None)
常用参数
rule : 指定重采样的时间间隔,例如 '7D' 表示每 7 天采样一次
how : 指定如何处理两个采样时间之间的数据
label : left 表示使用采样周期的起始时间作为结果 DataFrame 的 index;right 表示使用采样周期的结束时间作为结果 DataFrame 的 index
on : 指定根据哪一列进行重采样,默认根据 index 进行重采样,如果进行指定,要求该列数据为日期时间类型
7.2.15 多索引相关技术与操作
DataFrame 结构支持多个索引,既可以在读取数据时使用 index_col 指定多列
,也可以通过 groupby() 方法分组时指定多个索引
。对于含有多个索引的 DataFrame 结构,在使用 sort_index() 方法按索引排序
、使用 groupby() 方法进行分组
时,都可以使用参数 level 指定哪一级索引进行排序或分组
7.2.16 使用标准差与协方差分析员工业绩
- 关于标准差
如果标准差较大,则代表大部分数值和其平均值之间差异较大;如果标准差较小,则代表这些数值较接近平均值
通过 std() 方法实现 - 关于协方差
对于多组数据,可以使用协方差描述数据之间的相关性,如果两组数据 X 和 Y 的协方差 cov(X, Y) 的值为正值,说明两者正相关,结果为负值就说明负相关,如果为 0,认为两组数据在统计上“相互独立”。
通过 cov() 方法实现 - 关于协方差矩阵
为了便于分析多组数据之间的相关性,可以使用协方差矩阵。协方差矩阵对角线上分别是 X 和 Y 的方差,非对角线上是协方差。协方差大于 0 表示 X 和 Y 若其中一个增加,另一个也会增加;小于 0 表示如果其中一个增加则另一个会减少;为 0 表示,两者独立,其中一个变化时不影响另一个。方差是协方差的一种特殊情况,也就是两个变量相同时的情况
7.2.17 使用pandas的属性接口实现高级功能
-
DataFrame 数据中的
日期时间列
支持 dt 接口,该接口提供了 dayofweek(周几)、dayofyear(一年的第几天)、is_leap_year(是否为闰年)、quarter(哪个季度)、weekday_name(周几) 等属性和方法
注:dayofweek 和 weekday_name 都是周几,weekday_name 是英文,dayofweek 是 0-6 的数字
-
DataFrame 数据中的
字符串列
支持 str 接口,该接口提供了 center、contains、count、endswith、find、extract、lower、split 等属性和方法
7.2.18 绘制各员工在不同柜台业绩平均值的柱状图
- 关于 DataFrame 结构的绘图功能
DataFrame 结构的 plot() 方法可以直接绘制折线图
、柱状图
、饼状图
等各种图形,绘图时会自动调用 matplotlib 扩展库的绘图功能 - 对 DataFrame 结构中的数据进行可视化时,既可以直接使用 plot() 方法和 kind 参数指定图形的形状,也可以使用 plot 类的 line()、bar() 或其他方法绘制相应形状的图形
7.2.19 数据拆分与合并
- 拆分
可以对 DataFrame 使用切片或 loc 等运算按行或列进行拆分,得到多个 DataFrame 结构 - 合并
concat() 、append()、merge()、join() 函数用于合并多个 DataFrame 结构
concat(objs, axis=0)
常用参数
objs : 表示包含多个 Series、DataFrame 或 Panel 对象的序列
axis : 0 按行连接;1 按列连接
- 实例一:合并两个 Sheet 中的数据
append() 方法将作为参数的 DataFrame 追加到当前 DataFrame 尾部
- merge() 方法
将当前 DataFrame 和 right 参数指定的 DataFrame 进行合并
merge(right, how='inner', on=None, left_on=None, right_on=None)
常用参数
right : 另一个 DataFrame 结构
how : 表示数据连接的方式。取值可以是 'left'、'right'、'outer'、'inner'
on : 指定连接时依据的列名或包含若干列名的列表,要求指定的列名在两个 DataFrame 中都存在,如果没有任何参数指定连接键则根据两个 DataFrame 的列名交集进行连接
left_on : 指定连接时依据的左侧列名标签
right_on : 指定连接时依据的右侧列名标签
- join() 方法
可以实现按列对左表(调用 join() 方法的DataFrame)和右表(other 参数指定的 DataFrame)合并。如果右表索引与左表某一列的值相同可以直接连接;如果要根据右表中某一列的值与左表连接,需要先对右表调用 set_index() 方法设定这一列为索引
join(other, on=None, how='left', lsuffix='', rsuffix='')
常用参数
other : 右表
on : 指定连接时依据的左表列名,如果不指定则按左表索引的值进行连接
how : 表示数据连接的方式。取值可以是 'left'、'right'、'outer'、'inner'
lsuffix : 指定列名的后缀
rsuffix : 指定列名的后缀
- 实例二
其他文章
Python 数据分析与数据可视化(一)Python 开发环境搭建与编码规范
Python 数据分析与数据可视化(二)数据类型、运算符与内置函数
Python 数据分析与数据可视化(三)列表、元组、字典、集合与字符串
Python 数据分析与数据可视化(四)文件操作
Python 数据分析与数据可视化(五)线性代数基本知识
Python 数据分析与数据可视化(六)numpy 数组和矩阵运算
Python 数据分析与数据可视化(七)pandas数据分析实战
Python 数据分析与数据可视化(八)sklearn机器学习实战
Python 数据分析与数据可视化(工具篇)课程所需扩展库安装
Python 数据分析与数据可视化(实践篇)泰坦尼克号旅客生存预测