【3.1.1.2】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类型可以由如下类型创建:

  • 二维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

参考资料

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