【3.1.1】Pandas--Dataframe创建与读取

DataFrame类型由共用相同索引的一组列组成

索引 多列数据
index_0 data_a data_1 data_w
index_1 data_b data_2 ...... data_x
index_2 data_c data_3 data_y
index_3 data_d data_4 data_z
  • DataFrame是一个表格型的数据类型,每列值类型可以不同 DataFrame既有行索引、也有列索引
  • DataFrame常用于表达二维数据,但可以表达多维数据

一、DataFrame的创建

DataFrame类型可以由如下类型创建:

  • 二维ndarray对象
  • 由一维ndarray、列表、字典、元组或Series构成的字典
  • Series类型
  • 其他的DataFrame类型

生成空的pandas表

df = DataFrame(columns=('lib', 'qty1', 'qty2'))

1.1 二维ndarray对象

import pandas as pd
import numpy as np

d = pd.DataFrame(np.arange(10).reshape(2,5))

d
Out[4]: 
   0  1  2  3  4
0  0  1  2  3  4
1  5  6  7  8  9

注:自动索引

1.2 从一维ndarray对象字典创建

import pandas as pd
import numpy as np 
t = {'one':pd.Series([1,2,3],index = ['a','b','c']),'two':pd.Series([9,8,7,6],index = ['a','b','c','d'])}
d = pd.DataFrame(dt)
print d

   one  two
a  1.0    9
b  2.0    8
c  3.0    7
d  NaN    6

其他

cdrs_size = final_df.groupby(['cdrs'])['cdrs'].count()
cdr_dict = cdrs_size.to_dict()
cdr_df = pd.DataFrame.from_dict({'cdrs':cdr_dict.keys(),'cdr_num':cdr_dict.values()})
final_df = pd.merge(final_df, cdr_df, left_on='cdrs', right_on='cdrs', how='left')

1.3 从列表类型的字典创建

import pandas as pd
import numpy as np 

dt = {'one':[1,2,3,4],'two':[9,8,7,6]}
d = pd.DataFrame(dt,index =['a','b','c','d'])
print d

   one  two
a    1    9
b    2    8
c    3    7
d    4    6

print d.index
Index([u'a', u'b', u'c', u'd'], dtype='object')

print d.columns
Index([u'one', u'two'], dtype='object')

print d.values
[[1 9]
 [2 8]
 [3 7]
 [4 6]]

print d['one']
a    1
b    2
c    3
d    4
Name: one, dtype: int64

print d.ix['a']
one    1
two    9
Name: a, dtype: int64

print d['one']['a']
1

DataFrame基本操作类似Series,依据行列索引

1.5 from_dict

DataFrame.from_dict(data, orient='columns', dtype=None, columns=None)

注释:

  • data:即为要转为DataFrame的字典
  • orient:可选为’columns’或者’index’,默认为‘columns’,如果想要将dict的key作为DataFrame的列标题,则为‘columns’;如果想要将dict的key作为DataFrame的行标题,则为‘index’。
  • dype:指定的数据类型,如果不指定,则由推断得到
  • columns:当以dict的key作为行标题时,列标题缺省默认为0,1,2…,colunms参数可以指定列标题的内容

例子:

data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
pd.DataFrame.from_dict(data)
    col_1 col_2
0      3     a
1      2     b
2      1     c
3      0     d

Specify orient=‘index’ to create the DataFrame using dictionary keys as rows:

data = {'row_1': [3, 2, 1, 0], 'row_2': ['a', 'b', 'c', 'd']}
pd.DataFrame.from_dict(data, orient='index')
       0  1  2  3
row_1  3  2  1  0
row_2  a  b  c  d


When using the ‘index’ orientation, the column names can be specified manually:

pd.DataFrame.from_dict(data, orient='index',
                       columns=['A', 'B', 'C', 'D'])
       A  B  C  D
row_1  3  2  1  0
row_2  a  b  c  d

1.6 字典dict转dataframe

df_aa = pd.DataFrame(list(aa_count.items()), columns=['aa', 'count'])

1.7 将列表(List)转换为数据框(Dataframe)

Python中将列表转换成为数据框有两种情况:第一种是两个不同列表转换成一个数据框,第二种是一个包含不同子列表的列表转换成为数据框。

第一种:两个不同列表转换成为数据框

from pandas.core.frame import DataFrame
a=[1,2,3,4]#列表a
b=[5,6,7,8]#列表b
c={"a" : a,
   "b" : b}#将列表a,b转换成字典
data=DataFrame(c)#将字典转换成为数据框
print(data)

输出的结果为

   a  b
0  1  5
1  2  6
2  3  7
3  4  8

第二种:将包含不同子列表的列表转换为数据框

from pandas.core.frame import DataFrame
a=[[1,2,3,4],[5,6,7,8]]#包含两个不同的子列表[1,2,3,4]和[5,6,7,8]
data=DataFrame(a)#这时候是以行为标准写入的
print(data)

输出结果:

   0  1  2  3
0  1  2  3  4
1  5  6  7  8

数据框的转置

data=data.T#转置之后得到想要的结果
data.rename(columns={0:'a',1:'b'},inplace=True)#注意这里0和1都不是字符串
print(data)

结果文件:

   a  b
0  1  5
1  2  6
2  3  7
3  4  8

二、文件读取

2.1 read_csv

最近处理数据时发现当pd.read_csv()数据时有时候会有读取到未命名的列,且该列也用不到,一般是索引列被换掉后导致的,有强迫症的看着难受,这时候dataframe.drop([columns,])是没法处理的,怎么办呢, 最笨的方法是直接给列索引重命名:

data6

        Unnamed: 0  high    symbol  time
date                
2016-11-01  0   3317.4  IF1611  18:10:44.8
2016-11-01  1   3317.4  IF1611  06:01:04.5
2016-11-01  2   3317.4  IF1611  07:46:25.5
2016-11-01  3   3318.4  IF1611  09:30:04.0
2016-11-01  4   3321.8  IF1611  09:31:04.0

data6.columns = list(‘abcd’)

data6

    a   b   c   d
date                
2016-11-01  0   3317.4  IF1611  18:10:44.8
2016-11-01  1   3317.4  IF1611  06:01:04.5
2016-11-01  2   3317.4  IF1611  07:46:25.5
2016-11-01  3   3318.4  IF1611  09:30:04.0
2016-11-01  4   3321.8  IF1611  09:31:04.0

读取tsv

bb = pd.read_csv("ig_bases_mutated_nucl_freq.tsv",sep='\t',index_col=False,header=None,skip_blank_lines=True)
  • index_col=False # 不用第一列作为index
  • header=None # 不用第一行作为header ;如果header=None,则默认的columns.names为[0,1,2,3..],数字哦
  • skiprows=[0,1,2] 不读取第一、二、三行数据
  • skipfooter = 3 最后3行不读

常用例子:

df = pd.read_csv(one_file_fp, skiprows=[0, 1, 2, 3, 4, 5], index_col=False, sep=',').dropna(subset=['Peptide'])

2.2 read_table

2.2.1 用空格或tab来切分数据

df = pd.read_table(‘paps_abangle_angles_results.tsv’,sep=” |\t”, engine=‘python’)

需要engine指定Python哦

5.2.2 12E8自动被识别为科学计数

dtype : Type name or dict of column -> type, default None

Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32} Use str or object together with suitable na_values settings to preserve and not interpret dtype. If converters are specified, they will be applied INSTEAD of dtype conversion.

df = pd.read_table(‘paps_abangle_angles_results.tsv’,dtype={“column_name”:“str”})

指定“column_name”那一列数据为str的数据类型

三、写文件

df_total.to_csv(result_fp,header=None,index =False)

四、报错

报错1

ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2

解决办法:

df = pd.read_table('input/Adimab_IRA_out.txt',header=None,index_col=False,sep='\t',engine='python')[[0,1]]

只要第一、第二列数据

报错2 CSV error: line contains NULL byte

原因:通常是因为保存时扩展名为xls或xlsx,而将其改为csv文件通常是重命名

解决方法1:

把它另存为.csv文件即可

解决方法2:

fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学