《利用python进行数据分析》第七章读书笔记:数据规整化

数据规整划:清理、转换、合并、重塑

一、合并数据集

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的索引顺序。

官网链接:pandas.DataFrame的使用方法及举例

总结: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:取出空白符,包括换行符。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容