数据规整划:清理、转换、合并、重塑
一、合并数据集
1.1 数据库风格的DataFrame合并&索引上的合并
顾名思义,数据库风格的合并的意思就是把数据集按照数据库中表的连接方式进行合并。索引上的合并,也属于数据库风格的合并的一种,只是默认使用索引作为数据集连接的键。
回想数据库中不同表的连接方式,主要有内连接和外连接两种方式,pandas中使用pandas.merge()函数或者DataFrame对象的实例方法join()来实现这两种连接操作。
1.1.1 pandas.merge的使用
导入库:import pandas as pd
函数原型: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”两列。
举例:可查看官网链接:pandas.merge的使用
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的索引顺序。
总结:merge和join的异同:
(1)两者都可以实现数据集的合并;
(2)pandas.merge为pandas的库函数,pandas.DataFrame.join为DataFrame对象的实例方法(后来我发现DataFrame也有一个merge方法pandas.DataFrame.merge和pandas.merge用法完全一样,使用详情见:pandas.DataFrame.merge使用说明);
(3) merge默认使用名字相同的列作为连接列,join默认使用索引列作为连接列;
(4) merge的默认连接方式为内连接,join默认为左连接;
(5) merge的sort参数默认为True,join的默认为False。
1.2 轴向连接
轴向连接的意思就是把多个数据集在行或者列上直接堆叠。可使用pandas.concat方法实现该功能。
pandas.concat的使用:
函数原型:pd.concat(objs) #此处只列出必选参数
函数功能:实现多个数据集的轴向连接,默认在axis=0上工作,即按行堆叠多个数据集。
返回:堆叠后的数据集
参数说明和举例见官网链接:pandas.concat的使用方法
1.3 合并重叠数据
函数原型:df1.combine_first(df2)
函数功能:用df2中的数据为df1中缺失的数据“打补丁”。
三、数据转换
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 的使用及举例
3.3 替换值
当我们需要替换数据集中的某些值时,replace可实现该功能pandas.DataFrame.replace 的使用及举例
3.4 重命名轴索引
轴标签即数据集的列名和行名。和数据集中的数值一样,轴标签也可以通过函数或者映射进行修改。修改方法有两种,一种是通过map函数,一种是通过rename函数。
举例:
(1)通过map函数将索引全部转换为大写字母:
data.index = data.index.map(str.upper) #修改原数据集
(2)通过rename函数将数据集的行标签的首字母全部大写,列标签全部大写:
data.rename(index=str.title, columns=str.upper)
pandas.DataFrame.rename函数的详细使用及举例
注意:rename帮我们实现了复制DataFrame并对其索引和列标签进行赋值。如果需要就地修改某个数据集,传入inplace=True即可。
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组成的数组,表示原始值的正负号
四、字符串操作
4.1 字符串对象方法
python内置的常用字符串方法:
count:返回子串在字符串中出现的次数(非重叠)
endwith、startwith:如果字符串以某个后缀开头或以某个前缀结束,则返回True
join:将字符串用作连接其他字符串序列的分隔符
index:如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置,否则引发ValueError
find:如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置,否则返回-1
rfind:如果在字符串中找到子串,则返回最后一个发现的子串的第一个字符所在的位置,否则返回-1
replace:用另一个字符串替换指定子串
strip、strip、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、strip、rstrip:取出空白符,包括换行符。