Pandas之DataFrame
DataFrame是一种由列向量和行向量组成的数据结构,它类似于电子数据表、数据库表格。
DataFrame的竖行称之为 column,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 column 和 index 来确定一个元素的位置,可以理解为一个二维数组。(有人把 DataFrame 翻译为“数据框”,是不是还可以称之为“筐”呢?向里面装数据嘛。)
DataFrame是一个类似于表格的数据类型,如图:
有这样一些参数:
data (方框内的数据): numpy ndarray (structured or homogeneous), dict, or DataFrame
index(行索引索引) : Index or array-like,如图中的8,9,9,10,11
columns (列索引): Index or array-like,如图中的A,B,C,D
dtype(data的数据类型) : dtype, default None
DataFrame统一的创建形式为:pd.DataFrame(data,columns=,index=)其中columns为列的索引,index为行的索引。index或者columns如果不进行设置则默认为0开始的整数,也是行的绝对位置,不会被覆盖;而通过外部数据(比如打开文件)创建DataFrame的话需要注意列名匹配的问题,给columns赋的值如果和数据来源当中列名不一样的话,对应的列下面会出现NAN。还有个常用参数为orient,默认为空,如果赋值’index’则将输入Series的index值作为DataFrame的columns。
Data的创建形式有以下几种:
一维数据类型进行创建:通过传递一维数据类型的形式创建。
二维数组创建:pd.DataFrame(二维数组,columns = ,index=);
外部输入就是读取文件等手段,如csv、excel等文件。概括来说就是先读取一个文件对象(pd.read_xxx,xxx是对应的文件类型,常用有csv、excel、table等)的对象,然后再通过该对象创建DataFrame,但要注意columns列名的命名。
一维数据类型创建
一维数据类型主要有:一维ndarray、列表、字典、Series等。首先是字典和Series类型创建DataFrame:
一个是将字典或者Series组合成列表进行创建:
import pandas as pd
a= {'a':1,'b':2}
b = pd.Series([1,2,3],index=list('abc'))
pd.DataFrame([a,b],columns = list('abcd'))
另一个是将两者放入字典里面创建:
import pandas as pd
a= {'a':1,'b':2}
b = pd.Series([1,2,3],index=list('abc'))
print('a:')
print(a)
print('\nb:')
print(b)
data = {'one':a,'two':b}
print('\ndata:')
print(data)
pd.DataFrame(data,columns = ['one','two','a','d'])
通过上面的例子发现,用一维数据结构来创建dataframe感觉很别扭,在结构的理解上很费劲,其实主要的原因是因为dataframe这种结构比较灵活导致的,如果语法更加的严格,明确指定data,colunm,index是不会导致理解上的困难。
下面的示例还是使用字典列表和嵌套字典来演示,但是理解上就比较轻松,
dic2 = {'a':[1,2,3,4],'b':[5,6,7,8],
'c':[9,10,11,12],'d':[13,14,15,16]}
dic2
type(dic2)
df2 = pd.DataFrame(dic2)
print(df2)
type(df2)
dic3 = {'one':{'a':1,'b':2,'c':3,'d':4},
'two':{'a':5,'b':6,'c':7,'d':8},
'three':{'a':9,'b':10,'c':11,'d':12}}
dic3
type(dic3)
df3 = pd.DataFrame(dic3)
print(df3)
type(df3)
输出:
a b c d
0 1 5 9 13
1 2 6 10 14
2 3 7 11 15
3 4 8 12 16
one three two
a 1 9 5
b 2 10 6
c 3 11 7
d 4 12 8
Out[14]:
pandas.core.frame.DataFrame
参数是dict,每个 dict 的 value 会被转化成一个 Series:
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo' })
print(df2)
输出:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
总结:通过上述的例子,可以总结一种情况,默认情况下使用字典来创建dataframe这种二维数据结构,字典的key会充当column,但是如果字典是嵌套的话,嵌套字典的列会充当index的。
通过二维数组创建数据框
import numpy as np
import pandas as pd
arr2 = np.array(np.arange(12)).reshape(4,3)
arr2
type(arr2)
df1 = pd.DataFrame(arr2)
print(df1)
type(df1)
输出:
0 1 2
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
Out[18]:
pandas.core.frame.DataFrame
标准的dataframe创建,下面的这个例子很好体现出用data、column、index来创建dataframe:
dates = pd.date_range('20130101', periods=6)
print(dates)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
print('\n',df)
输出:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
A B C D
2013-01-01 0.632776 0.512769 -0.548607 -1.455912
2013-01-02 -0.640468 0.142681 -0.890662 1.550619
2013-01-03 1.026986 0.945596 0.814094 0.876710
2013-01-04 0.241401 1.477270 1.979373 -0.698561
2013-01-05 0.014577 -2.107954 -0.216417 -0.159051
2013-01-06 1.836602 0.415864 -0.330007 0.246363
通过文件读取创建
文件处理是Pandas的重要特性,将在后续章节中重点介绍。