#刚刚使用简书,在word文档中写的笔记发布到简书中格式都不见了...修改中
《利用Python进行数据分析》第七章读书笔记
数据规整划:清理、转换、合并、重塑
一、合并数据集
1.1 数据库风格的DataFrame合并&索引上的合并
顾名思义,数据库风格的合并的意思就是把数据集按照数据库中表的连接方式进行合并。索引上的合并,也属于数据库风格的合并的一种,只是默认使用索引作为数据集连接的键。
回想数据库中不同表的连接方式,主要有内连接和外连接两种方式,pandas中使用pandas.merge()函数或者DataFrame对象的实例方法join()来实现这两种连接操作。
[if !supportLists]1.1.1 [endif]pandas.merge的使用:
函数原型:merge(df1, df2) #此处只列出必选参数
函数功能:实现两个数据集的连接
返回:连接后的数据集
参数说明:
参数说明:
df1, df2要合并的两个DataFrame数据集
how连接方式,可为inner、outer、left、right,对应数据库连接中的内连接、全外连接、左外连接和右外连接。默认为inner。
on指明用于连接的列名。必须存在于df1和df2中。若未指明,则以df1和df2列名的交集作为连接键。
left_on指明df1中用于连接的列名
right_on指明df2中用于连接的列名
left_index为True时表示把df1的行索引用作其连接键,默认为False
right_index为True时表示把df2的行索引用作其连接键,默认为False
sort根据连接健对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得良好的性能。
suffixes(后缀)字符串值元组,当df1和df2中有相同的列名且不为连接列时,用于追加到重叠列名的末尾,默认为(‘_x’, ‘_y’)。例,如果df1和df2都有“data”列,则结果中就会出现“data_x”和“data_y”两列。
copy
举例:
官网链接:pandas.merge的使用http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebrattp://pandas.pydata.org/pandas-docs/stable/merging.html
1.1.2 pandas.DataFrame.join的使用:
导入库:import pandas as pd
函数原型:df1.join(df2) #此处只列出必选参数
函数功能:实现两个数据集的连接,默认使用索引列作为连接列
返回:连接后的数据集
参数说明:
参数说明
df1, df2要合并的两个DataFrame数据集
how连接方式,可为inner、outer、left、right,对应数据库连接中的内连接、全外连接、左外连接和右外连接。默认为left(不同于merge)。
on指明df1用于连接的列名。若未指明,则以df1和df2的索引列作为连接键。
lsuffix当df1和df2中有相同的列名且不为连接列时,用于追加到df1的重叠列名的末尾。
rsuffix当df1和df2中有相同的列名且不为连接列时,用于追加到df2的重叠列名的末尾。
sort默认为False。按连接键排序结果DataFrame。如果为False,则保留df1的索引顺序。
官网链接:pandas.DataFrame的使用方法及举例http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.join.html
总结:merge和join的异同:
[if !supportLists](1) [endif]两者都可以实现数据集的合并;
[if !supportLists](2) [endif]pandas.merge为pandas的库函数,pandas.DataFrame.join为DataFrame对象的实例方法(后来我发现DataFrame也有一个merge方法pandas.DataFrame.merge和pandas.merge用法完全一样,使用详情见:pandas.DataFrame.merge使用说明http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html);
[if !supportLists](3) [endif]merge默认使用名字相同的列作为连接列,join默认使用索引列作为连接列;
[if !supportLists](4) [endif]merge的默认连接方式为内连接,join默认为左连接;
[if !supportLists](5) [endif]merge的sort参数默认为True,join的默认为False。
[if !supportLists]1.2 [endif]轴向连接
轴向连接的意思就是把多个数据集在行或者列上直接堆叠。可使用pandas.concat方法实现该功能。
pandas.concat的使用:
函数原型:pd.concat(objs) #此处只列出必选参数
函数功能:实现多个数据集的轴向连接,默认在axis=0上工作,即按行堆叠多个数据集。
返回:堆叠后的数据集
部分参数说明:
参数说明
objs参与堆叠的pandas对象的列表或者字典
axis指明堆叠的轴向,默认axis=0
join
join_axes
keys
names
ignore_index
官网链接:pandas.concat的使用方法http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.concat.html
举例:区别于merge和
[if !supportLists]1.3 [endif]合并重叠数据
函数原型:df1.combine_first(df2)
函数功能:用df2中的数据为df1中缺失的数据“打补丁”。
二、重塑和轴向旋转
2.1 重塑层次化索引
stack
unstack
2.2 将“长格式”旋转为“宽格式”
三、数据转换
3.1 移除重复数据
判断DataFrame各行是否有重复行:df.duplicated()
移除重复行:df.drop_duplicates()
根据某一列的值移除重复行:df.drop_duplicate([‘k1’])
drop_duplicate默认保留的是第一个出现的值组合,传入take_last=True则保留最后一个,如根据k1、k2两列的值删除重复行:df.drop_duplicated([‘k1’, ‘k2’],
take_last=True)
3.2 利用函数或映射进行数据转换
有时候我们需要对数据集中某一列的值进行转换,利用pandas.Series.map可以实现该功能:pandas.Series.map 的使用及举例http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html
3.3 替换值
当我们需要替换数据集中的某些值时,replace可实现该功能pandas.DataFrame.replace 的使用及举例:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html
3.4 重命名轴索引
轴标签即数据集的列名和行名。和数据集中的数值一样,轴标签也可以通过函数或者映射进行修改。修改方法有两种,一种是通过map函数,一种是通过rename函数。
举例:
[if !supportLists](1) [endif]通过map函数将索引全部转换为大写字母:
data.index = data.index.map(str.upper) #修改原数据集
[if !supportLists](2) [endif]通过rename函数将数据集的行标签的首字母全部大写,列标签全部大写:
data.rename(index=str.title, columns=str.upper)
pandas.DataFrame.rename函数的详细使用及举例:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
注意:rename帮我们实现了复制DataFrame并对其索引和列标签进行赋值。如果需要就地修改某个数据集,传入inplace=True即可。
3.5 离散化和面元划分
为了便于分析,连续数据常常会被离散化或拆分为“面元”(bin),意思就是将数据集根据某一列的值划分为几个范围。涉及到函数:
(1)pandas.cut的使用
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html
(2)pandas.qcut的使用
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.qcut.html#pandas.qcut
3.6 检测和过滤异常值
当数据集中存在异常值时,我们需要筛选出含有异常值的行并进行过滤操作。
例如:假如想找出某一列中绝对值大小超过3的值:
col = data[3]
col[np.abs(col > 3)]
筛选出全部含有“绝对值超过3或-3的值”的行:
data[np.abs(data > 3).any(1)]
将所有值限制在[-3, 3]之间:
data[np.abs(data) > 3] = np.sign(data) *3
注:np.sign返回的是一个由1和-1组成的数组,表示原始值的正负号
3.7 排列和随机抽样
利用numpy.random.permutation函数随机选取一个DataFrame的一些行,做法就是随机产生行号,然后进行选取即可。
如:
3.8 计算指标、哑变量
如果DataFrame的某一列有k各不同的值,可以派生出一个k列的矩阵或者DataFrame(值为1和0)。
如
四、字符串操作
4.1 字符串对象方法
python内置的常用字符串方法:
方法说明
count返回子串在字符串中出现的次数(非重叠)
endwith、startwith如果字符串以某个后缀开头或以某个前缀结束,则返回True
join将字符串用作连接其他字符串序列的分隔符
index如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置,否则引发ValueError
find如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置,否则返回-1
rfind如果在字符串中找到子串,则返回最后一个发现的子串的第一个字符所在的位置,否则返回-1
replace用另一个字符串替换指定子串
strip、rstrip、lstrip去除空白符(包括换行符)
split通过指定的分隔符将字符串拆分为一组子串
lower、upper分别将字母字符转换为小写或大写
ljust、rjust用空格(或其他字符)填充字符串的空白侧以返回符合最低宽度的字符串
4.2 正则表达式
通过python内置的re模块负责对字符串应用正则表达式,下面为常见的几个方法:
方法说明
findall、finditer返回字符串中所有的费非重叠匹配模式。Fandall返回由所有模式组成的列表,finditer通过迭代器逐个返回
match从字符串起始位置匹配模式,匹配到返回一个匹配项对象,否则返回None
search扫描整个字符串以匹配模式。如果找到则返回一个匹配项对象。跟match不同,其匹配项可以位于字符串的任意位置,而不仅仅是起始处
split根据找到的模式将字符串拆分为几段
sub、subn将字符串中所有的或前n个模式替换为指定表达式。
4.3 pandas中矢量化的字符串函数
矢量化字符串方法介绍:
方法说明
cat实现元素级的字符串连接操作,可指定分隔符
contains返回表示各字符串是否含有指定模式的布尔型数组
count模式的出现次数
endswith、startswith相当于对各个元素执行x.startswith(pattern)或x.endswith(pattern)
findall计算各字符串的模式列表
get获取各元素的第i个字符
join根据制定的分隔符将Series中各元素的字符串连接起来
len计算各字符串的长度
lower、upper转换大小写
match根据指定的正则表达式对各个元素执行re.match
pad在字符串的左边、右边或者左右两边添加空白符
center相当于pad(side=’both’)
repeat重复。如s.str.repeat(3)相当于对各个字符串执行x**3
replace用指定字符串替换找到的模式
slice对Series中的各个字符串进行子串截取
split根据分隔符或正则表达式对字符串进行拆分
strip、lstrip、rstrip取出空白符,包括换行符。
网友评论