《Python数据分析实战》
环境搭建
定义变量名时要遵循的规则:
- 变量名必须以字母或下画线开始,名字中间只能由字母、数字和下画线组成
- 长度不能超过255个字符
- 变量名在有效范围内必须具有唯一性
- 不能使用保留字(关键字)
- 区分大小写
不能对元组中的元素做修改,只能做切片查询。如果元组中只有1个元素,则需要在这个元素的后面加上逗号。数字100正确的表示方法为(100,)
列表:a=[1,2,3]
,常用列表函数
函数 | 用途 |
---|---|
append() | 向列表末尾添加单个元素 |
extend() | 向列表末尾添加多个元素 |
pop() | 删除列表中指定下标对应的元素 |
remove() | 删除列表中指定名称的元素,如果列表中有多个相同名称的元素,则只删除第1个 |
列表切片:
a[0] # 第一个元素
a[-1] # 最后一个元素
a[0:1] # 指定开头到指定结尾
a[:2] # 开头到指定结尾
a[1:] # 指定开头到结尾
a[:] # 所有元素
列表切片的结果只有1个元素,则不再是列表类型,显示为标量值;有多个元素,则依然是列表类型,显示为列表。
集合是无序集的,即集合中元素的位置无法固定,不能像列表、元组一样做切片。
获取字典的键和值,有3种常用操作:
- keys():获取字典中所有的键
- values():获取字典中所有键对应的值
- items():获取字典中所有的键值对
函数
自定义函数语法:
def 函数名称(参数):
语句块
规则:
- 以def关键词开头,后接函数名称和圆括号(),再接冒号
- 传入的参数必须放在圆括号中,圆括号之间用于定义参数
- 函数代码块内容以冒号起始,并且缩进
- return后接函数的最终返回值
匿名函数,一种特殊的自定义函数,特殊在定义的函数没有名称,一般用于功能比较简易的函数。使用lambda来创建匿名函数。语法结构如下:
lambda [arg1 [, arg2,...,argn]]: expression
函数的参数调用通常分为按位置给参数赋值和通过指定参数名称给参数赋值。按位置给参数赋值是对照函数的参数位置一一赋值,但如果遇到函数的参数比较多,并且只需使用到其中一部分参数时,如果按照参数位置赋值,函数就显得比较臃肿、不简洁,则可以通过指定参数名称来给这些参数赋值,即关键字参数赋值。参数赋值方式有两大优点:第一,不再需要考虑参数的顺序,函数的使用将更加容易;第二,可以只对那些希望赋值的参数赋值。
函数的参数分为必选参数和可选参数。
函数 | 用途 |
---|---|
type() | 查询类型 |
Pandas
NumPy
函数:
- np.array():创建普通数组
- np.arange():创建一个指定数字范围内的等差序列数组
- np.random.rand():生成随机小数
- astype():数组的数据类型转换
- reshape():数组的维度转换,将多维数组转换为一维数组
- flatten():将多维数组转换为一维数组
- np.concatenate():将多个一维数组合并成一个一维数组,首先要将多个一维数组组织在列表中,然后对列表中的一维数组合并;axis参数指明合并方向,axis=1表示横向合并,axis=0表示纵向合并
np.arange()的3种情况:
- 1个参数时,起始值默认为0,参数值为终止值,步长值默认为1
- 2个参数时,第1个参数为起始值,第2个参数为终止值,步长值默认为1
- 3个参数时,第1个参数为起始值,第2个参数为终止值,第3个参数为步长值。
表格管理技术
DataFrame表格的行索引获取用df.index属性,列索引获取用df.columns属性,如果需要同时获取,则用df.axes属性,只获取行索引可用df.axes[0]表示,只获取列索引可用df.axes[1]表示。
df.dtypes属性可以获取各列的数据类型。
DataFrame表格数据可以按行或列获取,按行获取数据使用df.iterrows(),按列获取数据使用df.iteritems()函数,但这两个函数获取数据后会产生一个生成器对象(generator object)
单列选择的两种方式:
df['列标签']
df.列标签
选择单列,返回Series类型数据;选择多列,返回DataFrame类型表格。
筛选法只能选择行,不能选择列。
实例:df[[True,False,False,True,True]]
,在df[]
中提供一组布尔值,这组布尔值必须遵循以下两点要求:
- 布尔值的元素个数必须与df表的行数相同,布尔值与df表的行是一一对应
- 布尔值必须存储在列表、数组和Series等数据结构中
loc切片法相当于是直接切片法df[]
的升级版。
行选择的表示方式有两种:
- 行索引为自然序号,则格式只能表示为
df.loc[行索引序号]
- 行索引为标签,则格式只能表示为
df.loc['行索引标签']
在指定DataFrame表格上添加列时,有直接添加列和df.assign()
两种方式,添加列的数据结构可以是列表、数组、Series等可迭代对象。
数据处理基础
mask()与where()结构相同,含义相反。mask()在条件成立时做处理,where()在条件不成立时做处理,均可以对Series和DataFrame进行判断处理。
逻辑统计:all()和any()
遍历函数:
- map()
- apply():用来遍历DatFrame的行或列,即遍历Series数据
- applymap():对DataFrame中的每个元素执行指定函数的处理
聚合函数,如sum(),max(),min(),mean()等。
极大值:nlargest()
极小值:nsmallest()
排名函数:rank(),统计出的名次是小数类型,在rank()之后加astype('int')
转换为整数类型。method参数提供对相同值的5种处理方法:
枚举 | 解释 |
---|---|
average | 默认值,对相同值做平均排名 |
min | 对相同值做最小排名,美式排名 |
max | 对相同值做最大排名 |
first | 对相同值出现的顺序做排名 |
dense | 与最小排名类似,但不同名次之间差值为1,中式排名 |
Python中的聚合函数可以对一组任意形式的序列值做统计;Pandas中的聚合函数只能对Series和DataFrame做统计;NumPy中的聚合函数可以对数组、Series和DataFrame做统计,Pandas和NumPy中的聚合函数在对二维数据统计时可以指定聚合方向。
字符串清洗
正则
如果需要重复使用一个正则表达式对象,可将正则表达式预编译成正则表达式对象,提高效率。
常见函数:
- match():从字符串的开始位置匹配,只返回第1次匹配成功的re.Match对象
- fullmatch():完整匹配整个字符串,只返回第1次匹配成功的re.Match对象
- search():从任意位置开始匹配,只返回第1次匹配成功的re.Match对象
- findall():返回所有匹配成功的数据,返回列表类型,列表可为空,或仅有一个元素
- finditer():返回所有匹配成功的数据,返回迭代器类型
- sub():对匹配成功的字符串执行替换处理。可以是普通字符串、有特殊字符的正则表达式、函数
- split():拆分,返回列表。正则表达式字符串就是拆分的分隔符,如果对正则表达式字符串使用括号进行分组,则所有分组里的内容也会返回列表里。
- compile():编译正则表达式,将正则表达式转换为re.Pattern对象
txt = '这是一段文本'
re.sub(r'\d+', '、', txt)
re.sub(r'(\d+)', r'\1、', txt)
re.sub(r'\d+', lambda m:m.group() + '、', txt)
sub()的3种不同的替换方式:
- 替换值为普通字符。代码
re.sub(r'\d+', '、', txt)
,第2参数是'、',表示将匹配成功的连续数字替换为顿号 - 替换值有特殊字符。代码
re.sub(r'(\d+)', r'\1、', txt)
,第2参数是r'\1、',其中\1表示引用正则表达式中第1个分组的内容,然后与顿号(、)连接 - 替换值是函数。代码
re.sub(r'\d+', lambda m:m.group()+'、', txt)
,第2参数是lambda m:m.group() + '、'
,其中lambda m:m.group()
是匿名函数,m表示匹配成功后返回的re.Match对象,group()表示获取re.Match对象的值,然后与顿号(、)连接。
语法:re.compile(pattern[,flags])
希望多种匹配模式同时生效,则可以使用字符'|',或直接写在正则表达式字符串的最前面:
re.compile(r'abc', re.U|re.M)
re.compile(r'(?um)abc')
常见正则表达式flags
的匹配模式
完整写法 | 简写 | 内联标记 | 注释 |
---|---|---|---|
re.ASCII | re.A | (? a) | 表示\w、\W、b、\B、\d、\D、\s和\S只匹配ASCII,而不是 Unicode |
re.UNICODE | re.U | (? u) | 表示\w、\W、\b、B、\d、\D、\s和\S依赖于Unicode 字符属性数据库 |
re.IGNORECASE | re.l | (? i) | 忽略大小写匹配。如表达式要求匹配小写字母,但实际上也会匹配大写字母 |
re.MULTILINE | re.M | (? m) | 多行模式,'^'匹配整个字符串的开始和每行的开始;'$'匹配整个字符串的结尾和每行的结尾 |
re.DOTALL | re.S | (? s) | 让'.'特殊字符匹配任何字符,包括换行符。如果没有此标记,则'.'匹配除换行符的其他任意字符 |
re.VERBOSE | re.X | (? x) | 允许编写更具可读性、更友好的正则表达式,忽略空格和#后面的注释 |
长度匹配,量词匹配,6种模式如下:
边界匹配指单词边界和首尾边界,边界匹配是匹配的位置,元字符如下:
分组匹配,分组就是将正则表达式字符串中被括号引用的部分作为整体。匹配完成后,分组的内容可以被获取,之后可以用\number转义序列进行再次匹配。普通分组与命名分组。
m.group(0)或者m.group()表示获取正则表达式匹配成功的所有数据,包括分组外的数据,m.group(1)表示第1个分组中的数据,m.group(2)表示第2个分组中的数据,以此类推。还可以使用切片的方式提取数据,这种表示方法更为简洁。m[0]与m.group(0)的作用相同,m[1]与m.group(1)的作用相同,以此类推。
日期和时间处理
高级索引
索引按方向可以分为行索引和列索引,按层级分类可分为单层索引和分层索引。在Pandas中行索引和列索引是可以修改的。分层索引(MultiIndex)可在Series或DataFrame上设置多个层次的索引,用于处理更高维度的数据。
分层索引数据的呈现方式还可以使用MultiIndex类下面的函数设置,分别按数组、元组、笛卡儿积和DataFrame这4种方式设置分层索引:
- pd.MultiIndex.from_arrays()
- pd.MultiIndex.from_tuples()
- pd.MultiIndex.from_product()
- pd.MultiIndex.from_frame()
函数:
- df.set_index():将某列或某几列数据设置为行索引
- df.reset_index():将行索引数据设置为列数据
- df.xs():直接选择指定一个或多个索引层级
- df.rename():重命名,修改某些索引标签
- df.sort_index():对索引排序
- df.swaplevel():各层级之间需要交换位置
- df.droplevel():删除某些索引层级
数据汇总
数据透视表
- df.pivot_table():aggfunc参数可以进行聚合处理
表格转换
函数:
- df.stack():列索引数据转换成行索引数据列,是指将分布在列方向展示的数据转换到行方向来展示。最后的转换结果可以是DataFrame表格或Series数据。将整个列索引层级的数据转换到行方向
- df.melt():将具体列做转换到行方向
- pd.melt():和df.melt()相同,多一个frame参数,提供被转换的表格。df.melt()中的df相当于frame参数
- df.unstack():将行索引数据转换成列索引数据,是指将分布在行方向展示的数据转换到列方向来展示。最后的转换结果可以是DataFrame表格或Series数据
- df.pivot():转换结果类似数据透视表,不支持数据聚合
- df.append():执行多表格的纵向拼接
- pd.concat():实现多表格的纵向、横向拼接
- df.join():以表格的行索引为连接键做横向拼接,更为灵活
- pd.merge():df.join()的进阶版