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) #三条曲线

 

posted @ 2018-01-08 16:27  xy小崽子  阅读(321)  评论(0编辑  收藏  举报