标题
padas基本操作
索引、选取、和过滤
算术运算与数据对齐
算术方法
ufuncs和统计函数
排序排名
唯一值、值计数、以及成员资格
缺失值处理
过滤缺失值
填充缺失值
padas基本操作
索引、选取、和过滤
Series的索引和numpy类似,并且Series的索引值不仅能为整数,还能利用索引对象与值的映射关系去选取元素,这些在上一篇介绍Series已经提到过了。但还有一点需要注意的是,numpy、列表以及元祖的切片操作是不包含末端的,而Series利用标签切片是包含末端的。(用整数索引和正常切片是一样的)
而对DataFrame的索引可以索引DataFrame的一个或多个列。
同时,用轴标签去将DataFrame切片仍然是包括末端的。
但我们对DataFram使用布尔索引进行数据选取的时候
我们可以看到,如果某一行里存在符合条件的元素,那么这一行就会被选出来,但是作为结果的DataFrame不符合条件的元素会变成缺失值。但是如果我们目的是对这一些符合条件的元素操作,结果和numpy是一样的
此外,pandas还有层次化索引,它使你能在一个轴上拥有多个索引级别。以下是用层次索引的例子。
我们可以在创建的时候传入一个二维的列表或者数组隐式的创建层次索引。我们还可以通过
pd.MultiIndex显式的创建多层索引对象。例子如下。
上面的例子的结果是相同的。如果索引为不同层次的标签的组合,你还可以使用.from_product来创建多层索引,这样你就无须枚举所有的索引。
我们可以通过.index查看层次索引的构成
层次索引由两部分组成,levels描述索引所在的位置,levels[ 0 ]对应最外层的索引的取值,labels[ 0 ]对应位于最外层索引在不同位置的取值,如最外层索引的前三个索引标签都是a,因此label[ 0]开头对应3个,如此类推。
层次索引必须从外向内索引(左边为外),如果只想用内层索引,则外层索引必须为全切片。
算术运算与数据对齐
pandas最重要一个的功能是,它支持对不同索引对象进行算术运算。如果两个对象含有不同的索引,则结果的索引对象为两者的并集。
我们可以看到s1 s2相加的结果,索引相同的元素相加,只有一边独有的索引为缺失值,并且结果的索引为s1 s2索引的并集。DataFrame也是如此。
算术方法
如果两个对象含有不同的索引,那么它们之间运算的结果会出现缺失值。pandas提供了add、sub、div、mul这些方法可以指定fill_value参数,当在运算过程中存在不匹配的索引时,就会用fill_value填充使得索引匹配,结果不产生缺失值。
可以看到,结果中没有缺失值,其结果相当于将两个DataFrame补全并把NaN值填充为指定值之后在相加。
有些时候我们会让Series对象和DataFrame对象运算,例如
默认情况下,会把Series的索引与DataFrame的列索引匹配,然后沿着行一直传播。
显然由于DataFrame的列索引和Series的索引没有交集,并且由于广播的效果,使得结果全为NaN,如果我们想在列上广播,必须使用算术方法,并指定轴。
ufuncs和统计函数
ufuncs同样可以用于操作pandas对象,用法和numpy一样,这里就重复介绍了。但是还有一种操作就是:将函数应用到各列或各行的一维数组上,DataFrame的apply方法可以实现此功能
其中lambda表达式是匿名函数,它令代码更加简介,上面的例子把函数f应用到每一列,计算出每一列的极值。除了标量以外,apply还可以返回Series。(返回的值Series与原来的列索引对应变成了DataFrame)
此外,Python元素级的方法同样可以使用,这时要借助applymap,下面这个例子,把DataFrame的元素格式化为浮点数。
之所以叫applymap是因为Series有一个用于应用到元素级函数的map方法。
pandas 统计方法也与numpy,他们一般都有一下三个参数。
选项
说明
axis
选择约简的轴,行为0,列为1
skipna
是否忽略缺失值,默认为True
level
如果轴是层次索引,则根据level分组约简
由上表我们可以知道,pandas的统计函数会自动忽略缺失值,除非整个行或列都是缺失值,否则,结果不为缺失值。
pandas除了常见的求最大最小值(位置索引),累加和等等外,也有一些numpy中没有的统计函数。如count()用于计算缺失值的个数,还有用于计算百分数变化的pct_change()等等,在这里就不一一描述,使用前看一下官方文档即可。
排序排名
pandas既可以对索引排序也能对数据排序,对索引排序的时候使用实例方法.sort_index(),他可以通过指定axis来选择沿那一条轴进行排序(对应行,1对应列)。排序默认为升序,若想按降序排序令ascending = False即可。
若想对数据排序,则会用到order方法,若想按照莫一列进行排序指定by= 对应的列索引即可。注意缺失值在排序时都会放在最后。
pandas 有一个类似argsort的方法,他返回各个元素的大小排名,但与argsort不同的时,rank方法存在破坏平级关系的规则,默认情况下两个具有相同值的排名为它们组的平均排名。例如
总共有7个数据,如果按顺序排两个7肯定占据第6,7位,因此他们的平均排名为6.5。当然我们可以指定method参数打破这种平级关系,如果我们指定method为'first',那么先出现的元素的排名会靠前。还有其他的选项分别为'min','max'
。
唯一值、值计数、以及成员资格
在面对大量数据的时候,我们要想方设法的从Series的取值中抽取信息。如果,我们想的得到Series的唯一值数组我们可以使用unqiue函数
注意unique函数返回的是未排序序列。
我们也常常会用到value_count()方法,对某一列或某一行统计取值出现的频率并默认按降序排序返回。
索引标签为唯一值数组,并且按照降序排序,对应的值为标签的频率。
我们还有isin()方法用于判断矢量化集合的成员资格图,它可以返回与对象相同尺寸但取值为布尔值的对象,常用于数据选择
缺失值处理
缺失数据在正常数据集是非常常见的,为了让数据集能够正常的使用,使用前都会对缺失值进行处理,pandas提供isnull()方法返回一个含有布尔值的对象。notnull是isnull的否定式。
滤去缺失值
我们可以使用dropna方法去删除缺失值。但删除对于DataFrame来说就复杂很多,你有可能只希望丢弃全为NaN的行或列,或者只要有缺失值,你都要将某行或某列丢弃。dropna默认丢弃含有缺失值的行,我们可以设置axis使得我们可以丢弃含有缺失值的某列。如果我们只想丢弃全为NaN的行,设置how = ‘all’即可。
填充缺失值
我们可以使用fillna去填充缺失利用值而不是丢弃它,因为有些时候,数据是十分稀有宝贵的,要尽量重复利用,所以尽可能的去填充合理的值,例如(众数、均值等等)。fillna可以接受标量也可以接受字典,通过字典(列索引为键),就可以实现对不同的列填充更合理的值。fillna默认返回新对象,令inplace = False可以让对象就地修改。
另外fillna可以使用插值的方式填充数据,默认为'ffill',这里的用法和reindex的填充是一样的。
参考资料
《利用Python进行数据分析》 机械工业出版社 WesMcKinney著 唐学韬等译
以及晚上各位大佬的博文
AI遇见机器学习
mltoai
领取专属 10元无门槛券
私享最新 技术干货