先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python。最好就是一句python,对应写一句R。
pandas可谓如雷贯耳,数据处理神器。
---
目录
一、Series 和 DataFrame构成
1、series构造
2、dataframe构造
## pd.Categorical - 文本分类变量 - 进行分类
二、以某规则重排列.reindex
1、series
2、dataframe
三、切片与删除、增加操作与选中
1、切片-定位
2、删除
3、增加
四、排序与排名
1、排序
2、排名rank
五、简单统计量/计数
Transformations
Filtration
六、缺失值处理
七、其他
1、组合相加
2、dataframe应用函数
3、inplace 用法
4、DataFrame转换为其他类型
5、pandas中字符处理
6、时间序列
延伸应用一:dataframe如何横向、纵向合并?
延伸二:DataFrame横向合并/拼接 出现不可合并问题的
延伸三:dataframe、series的索引删除与创建问题
延伸四:使用 Cut 函数进行分箱
pd.qcut()和pd.cut()区别:
延伸五:实战中的内容拼接pd.concat
延伸六:空缺值NaN如何填补
延伸七:dataframe去重
延伸八:read_csv,数据读入
延伸九:dataframe 抽样 sample
延伸十:跟mysql一样文字规则查询
延伸十一:idxmin() 和 idxmax()
延伸十二:分组累加
延伸十三:利用`isin`进行数据筛选与清理
延伸十四:read_csv保存 - 读入报错不能转化成为数字
延伸十五:数据透视表
延伸十六:报错
延申十七:pandas_profiling
以下符号:
=R=
代表着在R中代码是怎么样的。
pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包
类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构。pandas 约定俗成的导入方法如下:
神奇的axis=0/1 :
合并的时候,axis=0代表rbinb,axis=1代表cbind;
单个dataframe时候,axis=0代表列,axis=1代表行
预先加载:
本图来源于:https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PandasPythonForDataScience+(1).pdf
————————————————————————————————————-
python很看重index这个属性,相比之下R对于索引的操作明显要弱很多。在延伸中提到对索引的修改与操作。
大括号代表词典,有点像list,可以自定义数列的名字。
其中df.index/df.columns分别代表行名称与列名称:
其中index也是索引,而且不是那么好修改的。
————————————————————————————————————-
————————————————————————————————————-
dataframe实质是numpy的高阶表现形式。如果选中也是很讲究,这个比R里面的dataframe要复杂一些:
两列:用irow/icol选中单个;用切片选择子集 .ix/.iloc
选择列:
利用序号选择的时候,注意[:,]中的:和,的用法
选择行:
其中跟R中的data.table有点像的是,可以通过data[1],就是选中了第一行。
python的切片要是容易跟R进行混淆,那么现在觉得区别就是一般来说要多加一个冒号:
一开始不知道切片是什么,其实就是截取数据块。其中还有如何截取符合条件的数据列。
跟R很大的区别,就是python中是从0开始算起。
同时定位的时候需要加入data.ix这个.ix很容易被忽略。
其中注意:
负向切片是需要仔细了解的:
drop(colnames/rownames,axis=0/1)代表按rbind、cbind删除。
选中之后,填入数据,当然数值很多情况下,应该用合并的操作了。————————————————————————————————————-
也有两个,order和sort。其中sort_index是按照Index进行排列。
Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控制升序或降序,默认为升序。若要按值对 Series 进行排序,当使用 .order() 方法,任何缺失值默认都会被放到 Series 的末尾。在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数)。
dataframe的排序
排名(Series.rank(method='average', ascending=True))的作用与排序的不同之处在于,他会把对象的 values 替换成名次(从 1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method参数就是起这个作用的,他有四个值可选:average, min, max, first。
排序应用一:多维复杂排序
pandas中有sort和rank,这个就跟R里面是一样的了。
rank(axis=0,ascending=Flase,method = 'first')
其中axis代表0为rbind,1代表cbind,ascending=True代表升序(从小到大)、Flase代表降序(从大到小);有一个method选项,用来规定下标的方式
data.ix[:,1]代表选中第一列,然后sorted代表对第一列进行排序;
a.ix[:,1]-1 代表排好的秩,-1就还原到数据可以认识的索引。
如果想要在同一表中实现按某列重排,使用sort_index:
ascending : bool or list of bool, default True(是否升序排序,默认升序为True,降序则为False。如果是列表,则需和by指定的列表数量相同,指明每一列的排序方式)
na_position : {‘first’,‘last’}, default ‘last'.(如果指定排序的列中有nan值,可指定nan值放在第一个还是最后一个)
————————————————————————————————————-
这个跟apply很像,返回的是按列求平均。其他常用的统计方法有:
其中df.describe()还是挺有用的,对应R的summary:
1、频数统计
R中的table真的是一个逆天的函数,那么python里面有没有类似的函数呢?
还有交叉计数的情况,直接看效果:
以上是数据:
还有分组计数:
可以选取某个:
如何groupby分组统计结果转换成Dataframe?
来看一下data.groupby(data["key"])之后,是一个LIST型,
类型是:(key1,dataframe1),(key2,dataframe2)
如果要拼接起来,可以pd.concat起来
聚合函数Aggregations:
(可参考:Python Pandas - GroupBy)
聚合多个:
文本聚合:
聚合之后为:
两个内容聚合合并:
这里的ID可能一个人有很多个,所以需要合并:
2、Apply 函数
在向数据框的每一行或每一列传递指定函数后,Apply 函数会返回相应的值。
可以传入函数,跟R里面apply一样。
————————————————————————————————————-
fillna() 函数可一次性完成填补功能。它可以利用所在列的均值/众数/中位数来替换该列的缺失数据。下面利用“Gender”、“Married”、和“Self_Employed”列中各自的众数值填补对应列的缺失数据。
输出结果为:ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))
输出结果返回了众数值和对应次数。需要记住的是由于可能存在多个高频出现的重复数据,因此众数可以是一个数组。通常默认使用第一个众数值:
现在可以进行缺失数据值填补并利用#2方法进行检查。
至此,可以确定缺失值已经被填补。请注意,上述方法是最基本的填补方法。包括缺失值建模,用分组平均数(均值/众数/中位数)。
————————————————————————————————————-
Series 和 DataFrame 对象的方法中,凡是会对数组作出修改并返回一个新数组的,往往都有一个 replace=False 的可选参数。如果手动设定为 True,那么原数组就可以被替换。
参考文献:Python 数据分析包:pandas 基础
参考:pandas.DataFrame.to_dict
outtype的参数为‘dict’、‘list’、‘series’和‘records’。 dict返回的是dict of dict;list返回的是列表的字典;series返回的是序列的字典;records返回的是字典的列表:
单列数据转化类型,用astype函数:
dict转化为dataframe:
numpy.ndarray转化为dataframe:
pandas提供许多向量化的字符操作,你可以在str属性中找到它们
时间序列也是Pandas的一个特色。时间序列在Pandas中就是以Timestamp为索引的Series。
pandas提供to_datetime方法将代表时间的字符转化为Timestamp对象:
有时我们需要处理时区问题:
构建一个时间序列:
Pandas提供resample方法对时间序列的时间粒度进行调整:
以上是将时间序列调整为小时,还可以支持月(M),分钟(Min)甚至秒(s)等。
参考博客:《Python中的结构化数据分析利器-Pandas简介》
几个时间序列处理的CASE:
其中,字符型的时间格式是'2017-02-01'
order['end_date'].dt.year,就可以定位到年份,2017
如果是时序格式的时间差,只能这么:order['date_diff']<=timedelta(days=14)比大小;不能order['date_diff']<=14
6、Crosstab 函数
该函数用于获取数据的初始印象(直观视图),从而验证一些基本假设。例如在本例中,“Credit_History”被认为会显著影响贷款状态。这个假设可以通过如下代码生成的交叉表进行验证:
以上这些都是绝对值。但百分比形式能获得更为直观的数据结果。使用 apply 函数可实现该功能:
————————————————————————————————————-
1、横向合并,跟R一样,用merge就可以。
merge(data1,data2,on="id",, how='left'/'right')
merge(data1,data2,left_on='id1', right_on='id2', how='left'/'right') #如果两个数据集Key不一样,也可以合并
还可以:
2、纵向合并、堆砌——concat
concat不会去重,要达到去重的效果可以使用drop_duplicates方法。
1、objs 就是需要连接的对象集合,一般是列表或字典;
2、axis=0 是连接轴向join='outer' 参数作用于当另一条轴的 index 不重叠的时候,只有 'inner' 和 'outer' 可选(顺带展示 ignore_index=True 的用法),axis=1,代表按照列的方式合并。
3、join_axes=[] 指定自定义索引
4、参数ignore_index=True 重建索引
同时,可以标识出来, keys=[ , ] 来标识出来,基本语句为:concat([D1,D2], keys=['D1', 'D2'] )
同时,concat也可以暴力的横向合并:concat([D1,D2], axis=1)
注意:
特别是参数ignore_index=True,一定要带上,因为不带上会出现索引都是0000,那么就不能方便地使用切片,而发生切片都是“0”
参考:
————————————————————————————————————-
尤其是两个数据集需要横向合并的情况,索引一般会出现较大的问题。如果自定义了索引,自定的索引会自动寻找原来的索引,如果一样的,就取原来索引对应的值,这个可以简称为“自动对齐”。
那么这样的两列数:
那么由于索引不一样,就会出现合并起来的时候,不对齐。
这时候就需要对索引进行修改,以下就是纵向/横向修改:
只有索引修改完之后才能进行合并,不然就会出现文不对题的情况。
其中注意:
series没有转置的情况
series没有转置的情况,我在尝试Series之间的横向合并的时候,只能纵向拼接。所以,需要转化成dataframe格式才能进行纵向拼接。
————————————————————————————————————-
可以看到,延伸三里面提到了因为索引而不方便进行数据操作的问题。那么如何在pandas进行索引操作呢?索引的增加、删除。
创建的时候,你可以指定索引。譬如:
从上面的内容,可以看出dataframe可以指定纵向、横向的索引。而series只能指定一个维度的索引。
(1)pd.DataFrame+pd.Series不能通过(index=None)来消除index:
所以,DataFrame/series也是不能通过以下的办法来取消索引:
以及
(2)通过reset_index来消除index
官方地址
可以来看一下这个函数的效果:
来看看开启inplace+关闭drop的效果,把Index列单独加入了数列中。
inplace开启+开启drop的效果,单独把index都删除了。
————————————————————————————————————-
有时将数值数据聚合在一起会更有意义。例如,如果我们要根据一天中的某个时间段(单位:分钟)建立交通流量模型模型(以路上的汽车为统计目标)。与具体的分钟数相比,对于交通流量预测而言一天中的具体时间段则更为重要,如“早上”、 “下午”、“傍晚”、“夜晚”、“深夜(Late Night)”。以这种方式建立交通流量模型则更为直观且避免了过拟合情况的发生。
cut使用方式有以下几种(来源:pandas 数据规整):
(1)按序列划分,序列:按序列的元素间隔划分 x,返回 x 各个元素的分组情况
(2)整数分段:整数:以 x 的上下界等长划分,可用 precision 参数调节精度
函数与 cut 类似,但它可以根据样本的分位数对数据进行面元划分:
一个案例:
下面的例子中定义了一个简单的可重用函数,该函数可以非常轻松地实现任意变量的分箱功能。
参考:Python 数据处理:Pandas 模块的 12 种实用技巧
来源:Pandas —— qcut( )与cut( )的区别
qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的
cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的
(1)qcut
传入q参数
传入lable参数
传入retbins参数
如果有重复的问题:
(2)cut函数
传入bins参数
传入lable参数
传入retbins参数
有一种应用场景是分好类别之后,如何对新数据进行分类,切割:
——————————————————————————————
延伸五:实战中的内容拼接pd.concat
以上的语句中:concat需要用[]拼接起来,然后想“无缝”拼接两个list,如果不是list,需要data.tolist()进行格式转化。最后的ignore_index不能忘记,因为python里面对索引的要求很高,所以重叠的索引会删除新重复的内容。
其中这里想接入一条空白信息,但是没有R里面的rep函数,于是这边用了带空格的NA,最后用split隔开来达到批量获得某条符合要求的空白数据集。
————————————————————————————————————————————————————
前面提到的dataframe中填补缺失值可以使用.fillna,除了缺失值其实还有NaN的形式,dataframe好像不是特别能处理,于是自己写了一个函数来处理。
输入dataframe,输出dataframe,用0填补。当然可以自己改一下,调整成自己的想要的数值。
延伸七:dataframe去重
来源: Python对多属性的重复数据去重
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次出现的项
延伸八:read_csv,数据读入
pandas.read_table — pandas 0.20.3 documentation
如果读入有问题,可以跳过:
设置:
如果报错:
解决方式:
https://github.com/pandas-dev/pandas/issues/11166
延伸九:dataframe 抽样 sample
延伸十:跟mysql一样文字规则查询
其中该函数为:
参考:pandas.Series.str.contains — pandas 1.4.3 documentation
来看一下如何匹配多个字符,并且是按照,并集,或者交集的方式:
参考:Pandas 3个不为人知却好用的函数
Pandas 里面的 idxmin 、idxmax函数与Numpy中 argmax、argmin 用法大致相同,这些函数将返回第一次出现的最小/最大值的索引。在下面代码中,我们构建了一个DataFrame,通过idxmin() 函数帮助我们找到了每列的最小值所对应的索引。
idxmin() 函数接受一个可选参数axis, 可以用来控制是按照行还是列的维度查找最小值的索引,默认是axis=0。
参考:Pandas 3个不为人知却好用的函数
这是两个非常酷的内建函数,用于分组累加计数和累加求和,可以为您提供许多帮助。我们还是基于上一节中的活动费用表,来进行演示。
现在我们想完成以下几个功能:
•按照Name分组统计,每个人累计参加活动次数•按照Name分组统计,每个人累计参加活动费用
参考:中文文档,https://www.pypandas.cn/docs/user_guide/indexing.html#用放大设定
考虑一下isin()方法,该方法返回一个布尔向量,只要元素存在于传递列表中,该向量就为真。这允许您选择一列或多列具有所需值的行:
对象可以使用相同的方法,当您不知道哪些搜索标签实际存在时,它们非常有用:
他可以,如果没有匹配到的,则不会显示;而reindex则不行!
DataFrame也有一个isin()方法。调用时,将一组值作为数组或字典传递。如果values是一个数组,则返回与原始DataFrame形状相同的布尔数据框,并在元素序列中的任何位置使用True。
通常,您需要将某些值与某些列匹配。只需将值设置为键为列的位置,值即为要检查的项目列表。
结合数据帧的同和方法来快速选择符合给定的标准对数据子集。要选择每列符合其自己标准的行:
看一下这篇文章:
基于pandas的数据分析之数据类型转化踩坑总结_逸辰杳的博客-CSDN博客
所以在基于pandas操作csv文件时,需要特别注意这种情况。如果在后续的分析中,需要保留原始数据集中的数据类型,则在读取csv文件时,需要显示的指定dtype参数,从而保证数据类型的前后统一。
参考:Python——数据透视(介绍pivot_table函数的使用方法) - 小猪课堂 - 博客园
其中,index是索引,values是数值;columns是横向的索引;fill_values是填补值
其中,aggfunc中的nunique:
打开文件时修改一下默认值:
with open(args.whanno_txt,"r",encoding='utf-16')
参考“:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte - 简书
pandas_profiling :教你一行代码生成数据分析报告 - 知乎
生成报告与导出:
# 延伸十八:相关性
这里有一个新的库,corrmat,相关性:
延伸十九:数据扩充的方式:将一个列表类元素拆成一行数据