欢迎来我的个人博客:fizzyi
Pandas介绍
查看pandas版本
import pandas as pd
pd.__version__
pandas主要的两个数据结构是Series
和DataFrame
导入模块
import numpy as np
from pandas import Series,DataFrame
Pandas数据结果: Series
从一般意义上来讲,Series可以简单的被认为是一维的数组。Series和一维数组最主要的区别在与Series类型具有索引(index),可以和另一个编程中最常见的数据结构哈希联系起来。
创建Series
创建一个Series的基本格式是s = Series(data,index=index,name=name)
。首先我们从数组创建Series:
a = np.random.randn(5)
print(a)
s = Series(a)
print(s)
[-1.24962807 -0.85316907 0.13032511 -0.19088881 0.40475505]
0 -1.249628
1 -0.853169
2 0.130325
3 -0.190889
4 0.404755
可以在创建Series时添加index,并可使用Series.inde查看具体的index。但是需要注意的一点是,当从数组创建Series时,若指定index,那么index长度和data的长度一致。
s = Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s)
a 0.509906
b -0.764549
c 0.919338
d -0.084712
e 1.896407
创建Series的另一个可选项是name,可指定Series的名称,可以用Series.name访问。
Series还可以从字典创建。
d = {'a':0,'b':1,'c':2}
print(d)
s = Series(d)
print s
{'a': 0.0, 'c': 2, 'b': 1}
a 0
b 1
c 2
使用字典创建Series时指定index的情形(index长度不必和字典相同,如果多了的话,pandas将会自动为多余的index分配NaN)
字典创建的Series,数据将按index的顺序重新排列。
Series(4,index=['a','b','c','d'])
a 4
b 4
c 4
d 4
e 4
如果数据就是一个单一的变量,如数字4,那么Series将重复这个变量。
Series 数据的访问
访问Series数据可以和数组一样使用下标,也可以像字典一样使用索引,还可以使用一些条件过滤。
s = Series(np.random.randn(10),index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
s[0] #取第一位
s[:2] #取0,1
s[[2,0,4]] #取2,0,4位
s[['e','i']] #取index为e 和 i的
s[s > 0.5] #取值大于0.5的
'e' in s #判断s中有没有下标e
Pandas数据结构:DataFrame
DataFrame
是将多个Series
按列合并而成的二维数据结构,每个列单独取出来是一个Series
,和SQL数据库中取出的数据是类似的。DataFrame
的优势在于可以方便的处理不同类型的列。
创建DataFrame
方法一
从字典创建DataFrame
。DataFrame
是一个二维的数据结果,是多个Series
的集合体。先创建一个值是Series
的字典,然后转换为DataFrame
d = {'one':Series([1.,2.,3.,],index=['a','b','c']),'two':Series([1.,2.,3.,4.],index=['a','b','c','d'])}
df = DataFrame(d)
print df
one two
a 1 1
b 2 2
c 3 3
d NaN 4
可以指定所需的行和列,若字典中不含有对应的元素,则为NaN
df = DataFrame(d,index=['r','d','a'],columns=['two','three'])
print df
two three
r NaN NaN
d 4 NaN
a 1 NaN
-
dataframe.index
和dataframe.columns
查看DataFrame
的行和列 -
dataframe.values
则以数组的形式返回dataframe的元素
方法二
DataFrame
也可以从值是数组的字典中创建,但是各个数组的长度需要相同
d = {'one':[1,2,3,4],'tow':[4,3,2,1]}
df = DataFrame(d,index=['a','b','c','d'])
print df
one two
a 1 4
b 2 3
c 3 2
d 4 1
值如果不是数组,没有这一限制,并且缺失值补成NaN
如果需要创建一个空的DataFrame
df = DataFrame()
方法三
使用concat
函数基于Series
或者DataFrame
创建一个DataFrame
a = Series(range(5))
b = Series(np.linspace(4,20,5))
df = pd.concat([a,b],axis=1)
print df
0 1
0 0 4
1 1 8
2 2 12
3 3 16
4 4 20
其中axis=1表示按列合并,axis=0表示按行合并。
df = DataFrame()
index = ['alpha','beta','gamma','delta','eta']
for i in range(5):
a = DataFrame([np.linspace(i,5*i,5)],index=[index[i]])
df = pd.concat([df,a],axis=0)
print df
0 1 2 3 4
alpha 0 0 0 0 0
beta 1 2 3 4 5
gamma 2 4 6 8 10
delta 3 6 9 12 15
eta 4 8 12 16 20
DataFrame
数据的访问
因为DataFrame
是以列作为操作的基础的,所以全部的操作都可以想象成先从DataFrame里取出来一列,再从这个series中取元素即可。
-
datafrae.column_name
只能选取一列 有列名,必须使用列名选取,在没有列名的时候是无效的。 -
dataframe[]
可以选择多列 无列名 使用下标选取列
df.columns = ['a','b','c','d','e']
使用dataframe.columns为dataframe赋列名
从dataframe中单独取一列出来,其数据结构显示的是series,取两列及以上的结果仍然是dataframe。访问特定的元素可以如series一样使用下标或者是索引。
若需要选取行,可以使用dataframe.iloc按下标选取,或者使用dataframe.loc按索引选取。
print(df.iloc[1])
print(df.loc['beta'])
选取行还可以使用切片的方式或者是布尔类型的向量
print(df[1:3])
bool_vec = [True,False,True,True,False]
print(df[bool_vec])
行列组合起来选取数据
print(df[['b','d']].iloc[[1,3]])
print(df.iloc[[1,3]][['b','d']])
print(df[['b','d']].loc[['beta','delta']])
print(df.loc[['beta','delta']][['b','d']])
如果只是某个特殊位置的元素的话,dataframe.at 和dataframe.iat是最快的方式,它们分别用于使用索引和下标进行访问。
print(df.iat[2,3])
print(df.at['gamma','d'])
dataframe.ix可以混合使用索引和下标进行访问,唯一需要注意的地方是行列内部需要一致,不可以同时使用索引和下标访问行或者列。
print(df.ix['gamma',4])
print(df.ix[['delta','gamma'],[1,4]])
print(df.ix[[1,2],['b','e']])
#错误的写法
print(df.ix[['beta',2],['be','e']])
print(df.ix[[1,2],['b',4]])