首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python模块-Pandas(四)文件读写与数据处理

1.1 read_csv

读取csv文件。csv文件在生物信息学中用的很广泛,其是一种普通文本编码格式的文件,很容易在linux系统及本地查看,只不过该文件各字符之间使用逗号(,)分隔。

读取命令为

在上述的例子中,index_col="rank"用于将rank一列信息作为index,skiprows=[1]表示读入文件是跳过第二行内容,此时应该注意的是读取时如果有表头,skiprows=[0]表示表头信息。

1.2 read_table

read_table方法与read_csv方法类似,可以读取几乎所有的文本文件,在读取时,可以通过以下参数灵活的读取文件。

sep

指定分隔符,读取特殊格式的文件,比如用逗号或者空格隔开的文本

如果文件是csv文件,也可以使用1.1章节方法进行读取。

header,names

header指定数据的表头,names指定读入后数据框的列标。默认情况下,将导入数据的第一行作为数据的表头,若导入文件不含表头,需要指定禁用此功能,此时列名为从0开始的递增序列,同时也可以通过names指定,如下。

index_cols,shiprows,nrows=num,shipfooter=num

index_cols指定行标来源于哪一列,skiprows指定不读入数据的行标,nrows表示需要读取的行数,shipfooter表示不读入末尾的num行,具体使用参见1.1。

na_values=index

将指定的数据替换成NA,例如可以将空字符替换成NA,代码为

以上代码中表示将rank这一列为3的字符替换成NaN。

encoding=string

通过encoding参数指定编码格式,对一些汉字或者其他编码的文本读取而言,很重要

1.3 excel文件读取

ecxel文件是目前用到最多的文件,但是其编码格式在linux系统上为二进制,直接打开时会存在文本乱码的情况。pandas模块提供了直接读取excel文件读取的方法,不过需要xlrd和openpyxl两个模块用来读写文件,在使用pandas打开excel文件之前需要先安装这两个模块。

上述代码用read_excel()方法去读取文件,参数设置与之前相同。在pandas模块中,还提供了excel文件的另外一种读取方法,就是ExcelFile

ExcelFile方法在读取时,首先读取所有信息放到一个对象中,该部分内容无法直接打印,只能通过相应的属性去取值。如sheet_names用于获取标签sheets的名称列标,parse(sheet_name)去解析sheet_name下的内容并输出

1.4 文件分次读取

对于某些大文件而言,一次性读入时时间较长,且会占用很大的内存,所以可以进行分批次读入,优化性能,提高速度

chunksize=num

该方法用于读取较大文件,代码含义为每次读入num行信息,运行结束后返回一个迭代器,用于分部遍历整个文件

另外一种方法是在文本打开时使用iterator参数,该参数默认值为False,可以通过指定为True将输出结果转换成迭代器,示例如下。

上述示例通过使用iterator=True参数,将读入的内容转化为迭代器,每次读取一行内容

2. 文件内容的写入

文件的写入方式和打开方式基本一致,将read改为to即可。假设现在有数据文本data,要写入文件名为test文件,类型不定,命令如下

以上是基本的写入命令,除此之外,读入文件是的命令,比如header=None等依然可以使用,可以通过设置这些参数实现格式化输出

用以上的方法写入数据时,会保留数据框的原始结构,也就是说数据中会存在索引、列名等,若要实现纯文本数据的输出,需要进行处理后输出

以上代码是最基本的for循环输出,大家有没有更好或者更简单的办法?欢迎留言讨论。

3. 数值数据处理

通过文件读入数据时,很多位置的数据往往不符合要求、或者存在错误、或者数据缺失,在进行后续操作时需要作相应的处理。

3.1 去除缺省值

缺省值代表数据错误或者无数据,在拿到数据时,可以对缺失值做出处理,第一个想到的办法就是去除这些值。

从上面的示例中可以看出来,dropna方法是将含有缺省值数据所在的行全部删除,等同于命令执行结果。但是这种处理方式并不是最佳的,因为会丢掉很多的数据,此时可以添加如下的控制参数进行优化。

这种情况下只会删除整行全部数据为NA的数据,相比于不加参数时,保留了较多的数据。默认情况下,是对行数据进行处理,若想在列水平上筛选数据,可以通过实现。

除了以上两种方法,也可以设置thresh参数来对缺失值进行处理,代码如下。

thresh参数指定有效数值的个数。在某一行或某一列数据中,不管有多少个缺失值,只要有效数值的个数大于设定值,该部分数据就会被保留,而低于设定值的行或列就会被删除。

3.2 缺省值赋值

直接删除缺省值会造成一个问题,那就是数据的丢失,如果丢失的数据很重要,最终会导致分析结果错误或出现较大偏差,所以某些情况下可以尽可能的保留缺失值所在的行或列其他数据,此时可以对缺失值进行赋值,所用方法为pd.fillna(value)

以上就是关于缺失值赋值的介绍,默认情况下以列为单位进行处理,此时axis=0,并且不能设置按行处理,否则会报以下错误。

3.3 去除重复

在整合数据过程中,不可避免的会出现重复的内容,这时候需要对数据进行去重,一方面保证数据分析的可靠性,另一方面减少冗余的操作

默认情况下会对一整行数据进行处理,通过column_list指定对于哪一列进行去重处理,其他列数据与此保持一致

keep='last':在处理时,默认保留第一个重复项,若想保留最后一个重复项,可以添加此参数

通过data.duplicated()命令可以查看数据是否存在重复项,返回的为布尔逻辑值,无重复为False,有重复为True,去重就是删除此处状态值为True的数据行

4. 字符串数据处理

与python内建函数功能一致的函数有:

在pandas模块中,还有一些比较常用的字符串处理函数,详细介绍如下

contains(string)

判断某一字符串在不在序列的元素中,类似于in函数,返回的是布尔逻辑判断结果,True或者False

extract(pattern)

该函数是去除某一个序列中特定的值,pattern必须为一个正则表达式,并且通过括号()指定需要返回的信息,类似于正则表达式中group的用法,示例如下。

注意返回值是以数据框的形式返回,符合条件的会返回搜索到的字符串,不符合条件的用缺失值NaN替代

有两点需要注意:

pandas模块中的字符串函数只能用于序列,不能直接用于数据框

待处理的序列必须全部为字符串,不能是整型或浮点型的数值数据

判断字符类型

与python内置的函数使用方法大体相同,存在以下几个函数,示例如下

pad(width, side='left', fillchar=' ')

在字符串首尾添加字符串,默认添加字符为空格space

width指定最终的字符串长度

side指定在什么位置添加,参数为side : {'left', 'right', 'both'},默认为left

fillchar指定添加的字符,默认为空格space

还有另外一个函数,center,与在pad函数中使用side="both"参数时功能一致

repeat(int)

将字符串重复输出,int指定重复次数

5. 数据框数据合并

由于文件限制,有的时候我们会将同一个结果的几个部分分开保存,读入后需要对几部分的数据进行合并

merge

用于合并数据框,基本用法如下。

说明:

left_on和right_on:指定合并数据的标准列。合并时,以提供的数据列为基准合并数据,若两个数据框对应的列名相同,可以使用on="str"来指定参照数据,此处的str表示

how:指定合并方式,inner为只合并on指定的相同部分,outer合并on提供元素列所有信息,无值即为缺失NaN

suffixes:如果两个数据框中的列名有重复,可以指定该参数,用来区分数据来源,示例如下

left_index和right_index:用来指定合并后数据框用哪一个数据框的index

join

在python中,可以用join函数讲列表的元素进行合并,pandas模块中也有join函数,可以用来合并数据框,使用代码及详解如下

other:需要合并的数据,可以是一个或多个数据框,也可以是序列

on:index标签名称,指定以哪一列为基准进行数据合并

how:表示数据合并的方法,包括{‘left’, ‘right’, ‘outer’, ‘inner’},其中left只保留第一个数据框数据,right为第二个,outer保留两个数据框所有数据,inner表示只保留两个数据框的共有部分

concat函数

pandas模块中的concat函数也可以用于数据合并,用法及主要参数介绍如下

objs:想要合并的数据框或者序列

axis:在什么维度上进行数据合并,默认为0,以列为基准进行合并,1为按行合并

join:如何处理数据,outer表示全部显示,inner只显示共有部分

join_axes:按给定的index进行合并

keys:指定合并后数据的列表

combine_first函数

使用combine_first函数对两个数据框的数据进行合并时,会按index进行合并,在相同位置如果有两个值,合并时取第一个数据框对应位置处的数值,如果相同位置只有一个数据框有数值,则取当前值,如果两个数据框在该位置处都没有值,即为缺失值NaN

6. 数据框格式重排

pivot和melt函数

该方法主要是对数据框的数据进行合并归类。某些情况下,数据框包含的内容太多,需要对数据进行精简及重新排布,此时可以使用pivot()和melt()两个函数,此处定义了数据框的两种类型,一种是wide类型,该类型中数据框数据高度分类,精简程度较高;另一类是long类型,数据分列排布,离散化,两个函数基本语法如下。

pivot函数是将数据进行归类和压缩,找到数据之间的关系,示例如下

说明:

index='foo':设定行标

columns='bar':设定列标

values=['baz', 'zoo']:添加显示数据

从上面实例可以看出,pivot函数将数据框进行了重新整合,通过多级标签的形式展现了数据的规律,将long型的数据框转化为wide型的数据。而对于melt,是对wide类型的数据框进行拆分,回到初始的long型数据框,示例如下

参数说明:

df:指明要转化的数据框

id_vars:指明以哪些数据作为标签,此处以bar和baz两列数据作为标签

value_vars:指明要显示哪些数据,此处显示foo和zoo两部分数据

value_name:指明数据列的列表,默认为value,此处为mydata

stack()和unstack()函数

两个函数的作用是将数据进行重新组合,设定多个index序列,在形式上就好像将数据框转化为序列,只是该序列具有多个index序列

stack():将数据框转化为序列,此时序列为双index的序列

unstack():将序列转化为数据框

对于双index的序列,可以使用set_index将原有数据框中的数据转化为index序列,同时可以通过swaplevel来变更index顺序,示例如下:

在使用set_index的时候,默认是将列的数据转移到index部分,原有数据将会删除,可以添加drop=False参数来保留数据框中的原有数据

数据离散化-cut函数

数据离散化是将数据进行分类,划分区间,可以用cut函数来实现

从上面的示例可以看出,cut函数只应用于序列,若想要对数据框的某一列进行处理,需要先提取,在处理。

在上面的示例中,定义了数据分割区间(bins),除此之外,还可以给定区间个数,系统自己会进行划分,同时也可以给定每个区间的名称,示例如下

示例中,4指定的是区间个数,labels指定的是每个区间的名称

随机排布序列

将数据框中的数据按行打乱顺序后输出

有一点需要说明,take函数在选取数据时根据的是行标,并不是数据框真实的index名称,示例如下:

从上面可以看出,虽然numpy模块中的random.permutation会处理字符串类型的数据,但是在pandas模块中用take选取数据时会出错,原因就是take只接受整型数据序列(行标),不能是字符串。

除了这一种方法,还可以用来取出特定行数num的数据

以上就是pandas模块第四部分内容,欢迎指正、留言讨论。

参考资料:

Python for Data Analysis. Data Wrangling with Pandas, NumPy, and IPython (2017, O’Reilly)

http://pandas.pydata.org/pandas-docs/stable/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190122G1CY3600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券