from pandas import Series, DataFrame
import pandas as pd
Series
obj = Series([4,7,-5,3])
obj2 = Series([4,7,-5,3],index = ['a','b','c','d'])
sdata = {'Ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah': 5000}
obj3 = Series(sdata)
如果只传入一个字典,则结果Series中的索引就是原字典的键。
states = ['California','Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index = states)
pandas中的缺失用NaN来表示,
pd.isnull(obj4)
pd.notnull(obj4)
obj4.isnull()
obj4.name = 'population'
obj4.index.name = 'state'
Series的索引可以通过赋值的方式就地修改
DataFrame
构建DataFrame
data = {'state': ['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year': [2000,2001,2002,2001,2001],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data) #自动加上索引
可以指定列序列顺序
frame = DataFrame(data,columns = ['year', 'state', 'pop'])
可以指定行的索引
frame = DataFrame(data,columns = ['year','state', 'pop'],index = ['one', 'two', 'three', 'four','five',])
如果传入的列在数据中找不到,就会产生NA值
frame = DataFrame(data,columns = ['year','state','pop','debt'])
获取列序列
frame.columns
列索引
frame['state']
frame.year
行索引
frame.ix['three']
列可以通过赋值的方式进行修改,数组赋值时长度必须一致,如果赋值的是一个Series,就会精确到索引,所有的空位会填上缺失值。
frame.debt = 16.8
不存在的列赋值会创建新的列
关键字del 用于删除列
另一种构建数据的形式叫嵌套字典
pop = {
'Nevada': {2001:2.4,2002:2.9},
'Ohio': {2000:1.5,2001:1.7,2002:3.6}
}
frame3 = DataFrame(pop)
可以进行转置
frame3.T
可以为DataFrame设置index and columns 的 name
frame3.index.name = 'year'
frame3.columns.name = 'state'
索引对象
index #不可修改
index = pd.Index(np.arange(3))
Index对象的主要类别和方法和属性查看p126
Series和DataFrame的基本功能
重新索引
obj = Series([4.5,7.2,-5.3,3.6],index = ['b', 'c', 'a', 'd'])
obj2 = obj.reindex(['a','b','c','d','e'])
当重新索引时不存在,就会引入缺失值,也可以填入默认值
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'],fill_value = 0)
除了填入默认值fill_value, 其他的method,包括ffill或pad向前填充值,bfill或backfill向后填充值
obj3 = Series('blue','green', 'yellow',index =[0,2,4])
obj3.reindex(range(6),method = 'ffill')
使用reindex()可以重新索引行,使用colunms关键字可以重新索引列:
obj3.reindex(columns = ['Texas', 'Utah', 'California'])
行和列可以同时重新索引:
obj3.reindex(index = [],method = 'ffill', columns = [])
利用ix的索引标签功能可以达到相同的功能:
obj3.ix(['a','b','c','d'],['Texas','Utah','California'])
reindex的一些参数:
index
method
limit 前向或者后向填充时的最大填充量
level ...
copy ...
columns
丢弃指定轴上的项
drop方法返回的是一个在指定轴上删除了指定值的新对象
obj = Series(np.arange(5), index = ['a','b','c','d','e'])
obj_new = obj.drop('c')
obj_new = obj.drop(['c','d'])
对于DataFrame,可以删除任意轴上的索引值:
data = DataFrame(np.arange(16).reshape(4,4),index = ['Ohio', 'California', 'Utah', 'New York'],
columns = [1,2,3,4])
data.drop('Ohio')
data.drop(['Ohio','New York'])
data.drop('Ohio',axis = 0)
data.drop(1,axis = 1)
data.drop([1,2],axis = 1)
索引、选取和过滤
Series的索引
obj = Series(np.arange(4.),index = ['a','b','c','d'])
obj['a']
obj[1]
obj[2:4]
obj[['a','c','d']]
obj[obj > 1]
注意,切片运算obj[1:2]包括2,obj['a':'c']包括'c'
Series的赋值
obj['a':'c'] = 5
DataFrame的索引
data = DataFrame(np.arange(16).reshape(4,4),index = ['Ohio','Colorado', 'Utah','New York'],
columns = [1,2,3,4])
单索引获取的是列
data[1]
data[[1,2]]
通过切片或者布尔型选取行
data[:2]
data[data[3]>5]
通过布尔型DataFrame进行索引:
data < 5
data[data < 5] = 0
对行进行标签索引,可以使用ix
data.ix[2]
data.ix['Colorado',[1,2]]
data.ix[['Colorado','Utah'],[3,0,1]]
DataFrame的索引汇总
obj[val] 选取单个列或一组列
obj.ix[val] 选取单个行或者一组行
obj.ix[:,val] 选取单个列或列子集
obj.ix[val1,val2] 同时选取列和行
reindex
xs方法 根据标签选取单行和单列,并返回一个Series
icol,irow ...
get_value, set_value 根据行标签和列标签选取单个值
算术运算和数据对齐
对象相加时获得是并集
s1 = Series([1,2,3,4,5],index = ['a', 'c', 'd', 'e','f'])
s2 = Series([2,3,4,5,6], index = ['a','b','c','d','e'])
s1+ s2
a 3.0
b NaN
c 6.0
d 8.0
e 10.0
f NaN
dtype: float64
自动的数据对齐操作在不重叠的索引处引入NA值。
缺失值会在算数运算中传播
对于DataFrame来说,行和列上的对齐操作同时发生
使用add算术加时用fill_value可以避免引入NA值
df1 = DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))
df2 = DataFrame(np.arange(20).reshape((4,5)),columns=list('abcde'))
df2+ df1
a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
df1.add(df2,fill_value = 0)
a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
灵活额算术方法
add()
sub()
div()
mul()
DataFrame与Series之间的运算
默认情况下,DataFrame与Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一致向下广播。
如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引形成并集。
如果要匹配行且在列上广播,必须使用算术运算方法
frame.sub(series,axis = 0)
函数应用和映射
frame = DataFrame(np.random.randn(4,3),columns = list('bde'),index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
np.abs(frame)
f = lambda x: x.max() - x.min()
frame.apply(f)
np.mean(frame,axis = 1)
np.sum(frame,axis = 1)
def f(x):
return Series([x.min(),y.max()],index=['min','max'])
frame.apply(f)
format = lambda x: '%.2f' % x
frame.applymap(format)
排序和排名
obj = Series(range(4), index=['b','c','d','a'])
obj.sort_index()
对于DataFrame来说可以对任意轴进行排序
frame = DataFrame(np.arange(8).reshape(2,4),index = ['One','Two'], columns = ['a','c','b','d'])
frame.sort_index(axis = 0)# 表示对行标签进行索引
frame.sort_index(axis = 1) # 表示对列标签进行索引
sort_index默认是升序排序的,也可以降序排序,关键字ascending = False
frame.sort_index(axis = 1, ascending = False)
按值来进行排序可以用order() ############存在问题
obj = Series(np.random.randn(5))
frame = DataFrame({'b':[4,7,-3,2], 'a':[0,1,0,1]})
frame.sort_index(by = 'b')
frame.sort_index(by = ['a', 'b'])
排名ranking
obj = Series([7,-5,7,4,2,0,4])
obj.rank()
obj = Series([7,-5,7,4,2,0,4])
obj.rank()
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
obj.rank(method = 'first')
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
obj.rank(method = 'max')
0 7.0
1 1.0
2 7.0
3 5.0
4 3.0
5 2.0
6 5.0
dtype: float64
obj.rank(method = 'max',ascending = False)
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
obj.rank(method = 'min')
0 6.0
1 1.0
2 6.0
3 4.0
4 3.0
5 2.0
6 4.0
dtype: float64
obj.rank(method = 'average')#默认
带有重复值的轴索引
obj = Series(range(5),index = ['a','a','b','b','c'])
obj.index.is_unique#index的值是否唯一
obj['a']
obj['c']
对于DataFrame来说也一样
汇总和计算描述统计
df = DataFrame([[1.4,np.nan],[7.2,-4.2],[np.nan,np.nan],[0.75,-1.3]],index = ['a','b','c','d'],columns = ['one','two'])
df.sum()#所有的行求sum
df.sum(axis = 1) # 所有的列求sum
注意 NA值会自动被排除,除非整个切片都是NA值,
df.mean(axis = 1, skipna = False)
约简方法的常用选项
axis 约简的轴,行用0,列用1
skipna 排除缺失值,默认值为True
level ...
df.idxmax()
df.idxmin()# 达到最大值或最小值的索引
df.cumsum()# 累加
df.describe() # 一次性产生多个汇总统计
one two
count 3.000000 2.00000
mean 3.116667 -2.75000
std 3.551174 2.05061
min 0.750000 -4.20000
25% 1.075000 -3.47500
50% 1.400000 -2.75000
75% 4.300000 -2.02500
max 7.200000 -1.30000
对于非数值型数据,describe会产生另外一种汇总统计:
obj = Series(['a','b','c','d'] * 4)
obj.describe()
count 16
unique 4
top b
freq 4
dtype: object
obj.describe()
count 16.000000
mean 2.500000
std 1.154701
min 1.000000
25% 1.750000
50% 2.500000
75% 3.250000
max 4.000000
dtype: float64
其他的统计汇总详见P114
相关系数和协方差 ---------------未完备-----------------
from pandas_datareader import data as web
all_data = {}
for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOD']:
all_data[ticker] = web.get_data_yahoo(ticker,'1/1/2000','1/1/2010')
price = DataFrame({tic: data['Adj Close'] for tic,data in all_data.iteritems()})
volume = DataFrame({tic: data['Volume'] for tic,data in all_data.iteritems()})