pandas中的数据结构主要包括:Series、DataFrame、Panel
通常在使用时,需要导入相应的对象
from pandas import Series, DataFrame
import pandas as pd
Series
Series是类似于一维数组的对象,由一组数据(Numpy数据类型)及与之相关的标签索引组成。
创建简单的Series,此时默认建立整数型索引
obj = Series([4, 7, -5, 3])
查看Series的取值与索引
obj.values
obj.index
指定索引
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
Series对象本身与索引都有name属性
obj4.name = 'population'
obj4.index.name = 'state'
赋值
Series可以通过索引方式取值或赋值
obj2['a']
obj2['d'] = 6
obj2[['c', 'a', 'd']]
通过布尔索引取值
obj2[obj2>0]
对Series运算
obj2*2
np.exp(obj2)
索引
Series可以看做定长的有序字典
'b' in obj2
'e' in obj2
如果数据存储在Python字典,可以直接通过字典创建Series
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = Series(sdata)
此时,如果重新指定索引,由于sdata与states匹配值只有3个,则California对应的值为NaN
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index=states)
可以使用isnull或notnull检测数据是否缺失
pd.isnull(obj4)
pd.notnull(obj4)
obj4.isnull()
Series在运算中会自动对齐不同索引的数据
obj3+obj4
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
DataFrame
DataFrame既有行索引,也有列索引,与R的data.frame相比,DataFrame中面向行与列的操作基本平衡。
构建DataFrame最常用的方法是直接传入等长列表或Numpy数组组成的字典
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
如果指定列的顺序,则DataFrame会按照指定顺序排列
DataFrame(data, columns=['year', 'state', 'pop'])
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
指定行索引,如果传入的列索引在数据中不存在,则产生NaN
frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five'])
frame2
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
有时会使用嵌套字典的方式创建DataFrame
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = DataFrame(pop)
DataFrame的index和columns也可以设置name属性
frame3.index.name = 'year'; frame3.columns.name = 'state'
DataFrame的值返回二维ndarray
frame3.value
查看DataFrame的元素类型
df2.dtypes
查看DataFrame的头部数据
df.head()
查看DataFrame尾部数据
df.tail(3)
查看DataFrame是否为NaN
df.notnull()
查看DataFrame的快速统计
df.describe()
DataFrame的转置
df.T
列操作
获取DataFrame的列
frame2['state']
frame2.year
此时返回的Series拥有与DataFrame相同的索引。
DataFrame的列可以通过赋值的方式修改,比如给予标量或一组值
frame2['debt'] = 16.5
frame2
frame2['debt'] = np.arange(5.)
frame2
当使用列表或数组为某列赋值时,需要注意长度匹配,或者是索引匹配
val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
为不存在的列赋值,从而创建新列
frame2['eastern'] = frame2.state == 'Ohio'
使用del关键字可以删除某列
del frame2['eastern']
行操作
行可以通过位置或名称取值
frame2.ix['three']
Panel
可以使用DataFrame组成的字典,或三维ndarray创建Panel对象
import pandas.io.data as web
pdata = pd.Panel(dict((stk, web.get_data_yahoo(stk))
for stk in ['AAPL', 'GOOG', 'MSFT', 'DELL']))
Panel中的每个项都是一个DataFrame,比如,选取指定日期或日期范围内的所有数据
pdata.ix[:, '6/1/2012', :]
将面板数据以堆积式的DataFrame展现
stacked = pdata.ix[:, '5/30/2012':, :].to_frame()
而to_panel是上面的逆运算
stacked.to_panel()