• 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) #三条曲线
    ----END---- HAVE A GOOD ONE! 以上为本人课余自学工具书/blog的笔记整理, 常有更新, 非100%原创!且读且学习。
  • 相关阅读:
    成为Java GC专家系列(3) — 如何优化Java垃圾回收机制
    成为JavaGC专家Part II — 如何监控Java垃圾回收机制
    JAVA缓存的实现
    Lock Less Java Object Pool
    跟屌丝大哥学习设计模式--享元模式
    数据库 -- 由数据库连接池引出的三种设计模式
    优秀博客推荐:各种数据结构与算法知识入门经典
    学习总结
    洛谷P3360偷天换日(树形DP)
    疯子的算法总结14--ST算法(区间最值)
  • 原文地址:https://www.cnblogs.com/xuying-fall/p/8484329.html
Copyright © 2020-2023  润新知