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)
如果只傳入一個字典橘荠,則結(jié)果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
構(gòu)建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',])
如果傳入的列在數(shù)據(jù)中找不到,就會產(chǎn)生NA值
frame = DataFrame(data,columns = ['year','state','pop','debt'])
獲取列序列
frame.columns
列索引
frame['state']
frame.year
行索引
frame.ix['three']
列可以通過賦值的方式進(jìn)行修改,數(shù)組賦值時長度必須一致廷区,如果賦值的是一個Series稽揭,就會精確到索引,所有的空位會填上缺失值。
frame.debt = 16.8
不存在的列賦值會創(chuàng)建新的列
關(guān)鍵字del 用于刪除列
另一種構(gòu)建數(shù)據(jù)的形式叫嵌套字典
pop = {
'Nevada': {2001:2.4,2002:2.9},
'Ohio': {2000:1.5,2001:1.7,2002:3.6}
}
frame3 = DataFrame(pop)
可以進(jìn)行轉(zhuǎn)置
frame3.T
可以為DataFrame設(shè)置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'])
當(dāng)重新索引時不存在吼拥,就會引入缺失值,也可以填入默認(rèn)值
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'],fill_value = 0)
除了填入默認(rèn)值fill_value, 其他的method,包括ffill或pad向前填充值,bfill或backfill向后填充值
obj3 = Series('blue','green', 'yellow',index =[0,2,4])
obj3.reindex(range(6),method = 'ffill')
使用reindex()可以重新索引行线衫,使用colunms關(guān)鍵字可以重新索引列:
obj3.reindex(columns = ['Texas', 'Utah', 'California'])
行和列可以同時重新索引:
obj3.reindex(index = [],method = 'ffill', columns = [])
利用ix的索引標(biāo)簽功能可以達(dá)到相同的功能:
obj3.ix(['a','b','c','d'],['Texas','Utah','California'])
reindex的一些參數(shù):
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進(jìn)行索引:
data < 5
data[data < 5] = 0
對行進(jìn)行標(biāo)簽索引枯跑,可以使用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方法 根據(jù)標(biāo)簽選取單行和單列,并返回一個Series
icol,irow ...
get_value, set_value 根據(jù)行標(biāo)簽和列標(biāo)簽選取單個值
算術(shù)運算和數(shù)據(jù)對齊
對象相加時獲得是并集
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
自動的數(shù)據(jù)對齊操作在不重疊的索引處引入NA值白热。
缺失值會在算數(shù)運算中傳播
對于DataFrame來說敛助,行和列上的對齊操作同時發(fā)生
使用add算術(shù)加時用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
靈活額算術(shù)方法
add()
sub()
div()
mul()
DataFrame與Series之間的運算
默認(rèn)情況下,DataFrame與Series之間的算術(shù)運算會將Series的索引匹配到DataFrame的列屋确,然后沿著行一致向下廣播纳击。
如果某個索引值在DataFrame的列或Series的索引中找不到,則參與運算的兩個對象就會被重新索引形成并集攻臀。
如果要匹配行且在列上廣播焕数,必須使用算術(shù)運算方法
frame.sub(series,axis = 0)
函數(shù)應(yīng)用和映射
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來說可以對任意軸進(jìn)行排序
frame = DataFrame(np.arange(8).reshape(2,4),index = ['One','Two'], columns = ['a','c','b','d'])
frame.sort_index(axis = 0)# 表示對行標(biāo)簽進(jìn)行索引
frame.sort_index(axis = 1) # 表示對列標(biāo)簽進(jìn)行索引
sort_index默認(rèn)是升序排序的,也可以降序排序茵烈,關(guān)鍵字ascending = False
frame.sort_index(axis = 1, ascending = False)
按值來進(jìn)行排序可以用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')#默認(rèn)
帶有重復(fù)值的軸索引
obj = Series(range(5),index = ['a','a','b','b','c'])
obj.index.is_unique#index的值是否唯一
obj['a']
obj['c']
對于DataFrame來說也一樣
匯總和計算描述統(tǒng)計
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 排除缺失值,默認(rèn)值為True
level ...
df.idxmax()
df.idxmin()# 達(dá)到最大值或最小值的索引
df.cumsum()# 累加
df.describe() # 一次性產(chǎn)生多個匯總統(tǒng)計
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
對于非數(shù)值型數(shù)據(jù)仑荐,describe會產(chǎn)生另外一種匯總統(tǒng)計:
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
其他的統(tǒng)計匯總詳見P114
相關(guān)系數(shù)和協(xié)方差 ---------------未完備-----------------
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()})