python(6):Scipy之pandas
pandas下面的数据结构是Series , DataFrame
在字典中, key 与 value对应, 但是key value 不是独立的, 但是在Series 中index 与value 是独立的, 它在某些应用中国有比字典更加强大的功能.
(一)Series
Series是有序一维数组, 由 数据+索引 组成
import pandas as pd s=pd.Series([1,2.0,'a']) print(s) #0 1 #1 2 #2 a
自带索引 0 ,1, 2...
也可以自己设置索引, 访问数据就是 s[idx]
import pandas as pd s=pd.Series(['apple','pig','table'],index=[1,2,3]) print(s) #1 apple #2 pig #3 table print(s[1]) # apple 访问数据
简单计算
import numpy as np import pandas as pd y=pd.Series([3,5,6],index=['a','b','c']) print(y) #a 3 #b 5 #c 6 print(y[1]) # 5 print(y*2)#作用在value上 变6 10 12 yy=np.exp(y) print(yy) #a 20.085537 #b 148.413159 #c 403.428793
Series的数据对齐
data={'A':100,'B':90} #字典 sindex=['A','B','C'] x=pd.Series(data,index=sindex) # 'c'这个索引在data中没有 则value=nan print(x) print(x.index) print(x.values) print(pd.isnull(x)) # 检测哪些值是空的
A 100.0
B 90.0
C NaN
dtype: float64
Index(['A', 'B', 'C'], dtype='object')
[100. 90. nan]
A False
B False
C True
dtype: bool
两个Series相加会怎么样?
import pandas as pd a=pd.Series([20,21,42],index=['a','b','c']) b=pd.Series([20,18,40],index=['a','e','c']) a+b #a 40.0 #b NaN #c 82.0 #e NaN #dtype: float64
相同index 的相加, a,b 中非共有的用nan
pandas还可以产生时间序列
import pandas as pd dates=pd.date_range('20171211',periods=5) #每一天,包括周末 print(dates)
DatetimeIndex(['2017-12-11', '2017-12-12', '2017-12-13', '2017-12-14',
'2017-12-15'],
dtype='datetime64[ns]', freq='D').
(二) DataFrame
pandas的模块中 Series对应一维序列, DataFrame 对应表格型的数据结构
可以把DataFrame 看成是共用同一个index 的Series 集合
import numpy as np import pandas as pd # 由array 创建 d1=pd.DataFrame(np.random.randn(3,3),index=range(1,4),columns=list('ABC')) print(d1) #由字典创建DataFrame d2={'name':['alice','mike','jason'],'pay':[10,20,30]} #默认index是从0开始的0 1 2 .. d2=pd.DataFrame(d2) print(d2)
A B C
1 -0.024970 0.681228 -1.575077
2 -0.470925 1.239218 2.425803
3 0.758001 -0.179529 -0.535435
name pay
0 alice 10
1 mike 20
2 jason 30
上述d2的分析
print(d2.index) # 行索引 RangeIndex(start=0, stop=3, step=1) print(d2.columns) # 列索引 Index(['name', 'pay'], dtype='object') print(d2.values) # 3*2 #[['alice' 10] # ['mike' 20] # ['jason' 30]] d2.index=[1,3,5] #修改索引 d2['name']='alice' # 将name列的数据全部改为了alice del d2['pay'] # 删除一列
查看数据
import pandas as pd import numpy as np d3=np.array([('a',100),('b',200),('c',300)]) d3=pd.DataFrame(d3,index=range(1,4),columns=['name','pay']) print(d3['name'])#访问name 那一列,也可以print(d3.name) #1 a #2 b #3 c print(d3.iloc[:2,1])#前两行,value的第2列元素 #1 100 #2 200
统计功能
d3.pay.min() # 最低工资的值 Out[127]: '100' d3[d3.pay>'180'] # 工资大于180的人 Out[129]: name pay 2 b 200 3 c 300
实例: 加总每个人的工资
import pandas as pd index=[1,2,3,4] h=np.array([('alice',4),('kitty',3),('bob',6),('nancy',2)]) hi=pd.DataFrame(h,index,columns=['name','pay']) print(hi) #for i in range(1,len(hi)+1): #报错!! # print(hi[i]) xx=hi.pay # 也是一个DataFrame for i in range(1,len(xx)+1): #由于index是从1开始的 print(xx[i]) xx[i]=float(xx[i]) # 为了后续的加总 print(hi.groupby('name').sum()) #将重复的放在一起,A 出现两次加总为一项! 42 print(hi)#不改变原来的hi
name pay
1 alice 4
2 kitty 3
3 bob 6
4 alice 2
4
3
6
2
pay
name
alice 6.0
bob 6.0
kitty 3.0
(三) pandas中的作图
import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,1) print(len(x)) #50 y=np.sin(4*np.pi*x)*np.exp(-5*x) plt.plot(x,y,'o') fig = plt.figure() #新建一个图形窗口,否则会画在一起 a=pd.Series([10,15,2,3,5]) plt.plot(a)
实例
import pandas as pd a=[(10,12),(15,7),(2,9)] b=[1,2,3] data=pd.DataFrame(a,index=b,columns=['v1','v2']) data.plot() #两条线
结果
import pandas as pd import matplotlib.pyplot as plt a=pd.Series([10,23,12,34,16]) x=a.index y=a.values plt.plot(x,y,'r--') plt.title('line') plt.xlabel('time') plt.ylabel('quantity') t=np.arange(0.,4.,0.01) # 画在一起的 plt.plot(t,t,t,t+1,t,t**2) #三条曲线