这些pandas技巧你还不会吗 | Pandas实用手册(PART II)
这一系列一共三部分,里面的一些技巧可能暂时用不上,但是相信总有一天你会接触到,建议收藏 每一小节对应代码大家可以在我共享的colab上把玩,
???? https://colab.research.google.com/drive/1WhKCNkx6VnX1TS8uarTICIK2ViPzNDjw
或者老规矩,订阅号后台回复 "pd" 获取
在我们上一篇超详细整理!Pandas实用手册(PART I)中,介绍了建立DataFrame以及定制化DataFrame显示设定两大类技巧。发现已经有同学留言催更了???????? 宠粉号主闪现赶到,来看看pandas系列第二篇吧:
数据清理 & 整理
取得想要关注的数据
数据清理&整理
这节列出一些十分常用的数据清理与整理技巧,如处理空值(null value)以及分割列。
处理空值
世界总是残酷,很多时候手上的DataFrame里头会有不存在的值,如底下一格格额外显眼的NaN
:你可以利用fillna
函数将DataFrame里头所有不存在的值设为0:当然,这个操作的前提是你确定在当前分析的情境下,将不存在的值视为0这件事情是没有问题的。
针对字符串类型的特征,你也可以将空值设定成任何容易识别的值,让自己及他人明确了解此DataFrame 的数据:
舍弃不需要的行列
给定一个初始DataFrame,你可以使用drop
函数来舍弃不需要的列,记得将axis
设为1:同理,你也可以舍弃特定行(row),
重置并舍弃索引
很多时候你会想要重置一个DataFrame的索引,以方便使用loc
或iloc
属性来存取想要的数据。
给定一个DataFrame:你可以使用reset_index
函数来重置此DataFrame的索引并轻松存取想要的部分:将函数的inplace
参数设为True
会让pandas直接修改df,一般来说pandas里的函数并不会修改原始DataFrame,这样可以保证原始数据不会受到任何函数的影响。
当你不想要原来的DataFrame df受到reset_index
函数的影响,则可以将处理后的结果交给一个新DataFrame(比方说df1):通过这样的方式,pandas 让你可以放心地对原始数据做任何坏坏的事情而不会产生任何不好的影响。
将字符串切割成多个列
在处理文本数据时,很多时候你会想要把一个字符串栏位拆成多个栏位以方便后续处理。
给定一个简单DataFrame:你可能会想把这个DataFrame的feature
栏分成不同栏,这时候利用str
将字串取出,并通过expand=True
将字符串切割的结果扩大成(expand)成一个DataFrame:注意我们使用df[columns] = ...
的形式将字串切割出来的2个新栏分别指定成性格
与特技
。
将list切割成多个列
有时候一个栏位里头的值为Python list:这时则可以使用tolist
函数做到跟刚刚字符串切割相同的效果:你也可以使用apply(pd.Series)
的方式达到一样的效果:遇到以Python list
呈现特征数据的情境不少,这些函数能让你少抓点头。
取得想要关注的数据
通常你会需要依照各种不同的分析情境,将整个DataFrame 里头的一部份数据取出并进一步分析,那么这节内容让你能够轻松取得想要关注的数据。
基本数据切割
在pandas 里头,切割(Slice)DataFrame 里头一部份数据出来做分析是非常平常的事情。让我们再次以Titanic数据集为例:你可以通过loc
以及:
的方式轻松选取从某个起始栏位C1
到结束栏位C2
的所有栏位,而无需将中间的栏位一一列出:
反向选取行列
通过Python常见的[::-1]
语法,你可以轻易地改变DataFrame里头所有栏位的排列顺序:你看栏位是不是逆序啦。同样也可以运用到行(row)上面,你可以将所有样本(samples)排序颠倒并选取其中N 列:注意我们同时使用:5
来选出前5个栏位。
条件选取数据
在pandas 里头最实用的选取技巧大概非遮掩(masking)莫属了。masking让pandas 将符合特定条件的样本回传:male_and_age_over_70
是我们定义的一个masking,可以把同时符合两个布尔判断式(大于70 岁、男性)的样本选取出来。上面注解有相同效果,但当存在多个判断式时,有个准确说明making意义的变量(上例的male_and_age_over_70
)会让你的程序代码好懂一点。
另外你也可以使用query
函数来达到跟masking一样的效果:在这个例子里头,你可以使用@
来存取已经定义的Python变数age
的值。
选择任一栏有空值的样本
一个DataFrame 里常会有多个栏位(column),而每个栏位里头都有可能包含空值。
有时候你会想把在任一栏位(column)出现过空值的样本(row)全部取出:这边刚好所有样本的Cabin
栏位皆为空值,但倒数第2个样本就算其Cabin栏不为空值,也会因为Age
栏为空而被选出。
选取或排除特定类型栏位
有时候你会想选取DataFrame里特定数据类型(字符串、数值、时间等)的栏位,这时你可以使用select_dtypes
函数:上面我们用一行代码就把所有数值栏位取出,尽管我们根本不知道有什么栏位。而你当然也可以利用exclude
参数来排除特定类型的栏位:pandas里的函数使用上都很只管,你可以丢入1个包含多个元素的Python list
或是单一str作为参数输入。
选取所有出现在list内的样本
很多时候针对某一个特定栏位,你会想要取出所有出现在一个list的样本,这时候你可以使用isin
函数来做到这件事情:
选取某栏位为top-k值的样本
很多时候你会想选取在某个栏位中前k大的所有样本,这时你可以先利用value_counts
函数找出该栏位前k多的值:这边我们以栏位Ticket
为例,另外你也可以使用pandas.Series
里的nlargest
函数取得相同结果:接着利用上小节看过的isin
函数就能轻松取得Ticket
栏位值为前k大值的样本:
找出符合特定字串的样本
有时你会想要对一个字符串类型栏位做正则表示式(regular expression),取出符合某个pattern
的所有样本。
这时你可以使用str底下的contains
函数:这边我们将所有Name
栏位值里包含Mr.
的样本取出,注意contains
函数接受的是正则表示式,因此需要将.
转换成\.
。
使用正则表示式选取数据
有时候你会想要依照一些规则来选取DataFrame 里头的值、索引或是栏位,尤其是在处理跟时间序列相关的数据:假设你想将所有索引在2000年2月内的样本取出,则可以通过filter
函数达成这个目的:filter
函数本身功能十分强大,有兴趣的读者可以阅读filter
官方文档进一步了解其用法。
选取从某时间点开始的区间样本
在处理时间数据时,很多时候你会想要针对某个起始时间挑出前t 个时间点的样本。让我们以上一小节的数据为例,在索引为时间型态的情况下,如果你想要把前3周的样本取出,可以使用first
函数:
- END -
转自:NewBeeNLP 公众号;
版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。
END
合作请加QQ:365242293
数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。