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/
领取专属 10元无门槛券
私享最新 技术干货