美文网首页我爱编程
pandas入门(持续更新)

pandas入门(持续更新)

作者: mrlevo520 | 来源:发表于2016-09-02 15:22 被阅读585次

    Python 2.7
    IDE Pycharm
    Pandas 0.18.0


    应该每天离目标更近一点
    

    首先

    推荐一下IDE,用的最顺手的是Pycharm,再配合anaconda2,简直完美,什么科学计算库都有,numpy,scipy,matplotlib应有尽有,乃大杀器有木有,对我们这种小白来说,什么乱七八糟依赖包好蛋疼有木有,有了Pycharm+anaconda2,我都被自己机智哭了。。。。

    这里写图片描述
    哈哈哈,不闹,↓是如何安装anaconda2方法囖囖囖
    pycharm下安装anaconda2方法,详见@木子岚的回答

    这里对anaconda2的强大我就不赘述了,直接开始今天的pandas学习咯~此博客主要还是自己当笔记看,所以,如果能帮到你,不胜荣幸!


    Day 1

    Series的使用

    # -*- coding: utf-8 -*-
    from pandas import  *
    
    obj = Series([4,7,-5,3])#标签结构。索引在左,值再右
    print obj
    print obj.values
    print obj.index
    
    0    4
    1    7
    2   -5
    3    3
    dtype: int64
    ----------------------------------
    [ 4  7 -5  3]
    ----------------------------------
    RangeIndex(start=0, stop=4, step=1)
    

    其实就是有有序字典的过程,还可以索引和数组运算!

    obj2 = Series([4,7,-5,3],index=['d','b','a','c'])#对应标签
    print obj2
    print obj2.index
    print obj2['a']#根据索引,其实是个有序字典
    print obj2[['c','b','a']]#也可以取一组值
    print obj2[obj2>0]
    print obj2*2 #会保留索引和值之间的联系
    
    d    4
    b    7
    a   -5
    c    3
    dtype: int64
    ----------------------------------
    Index([u'd', u'b', u'a', u'c'], dtype='object')
    ----------------------------------
    -5
    ----------------------------------
    c    3
    b    7
    a   -5
    dtype: int64
    ----------------------------------
    d    4
    b    7
    c    3
    dtype: int64
    ----------------------------------
    d     8
    b    14
    a   -10
    c     6
    dtype: int64
    
    

    字典直接用来建立Series,简单快捷

    sdata={'ohii':3000,'nam':2000,'wyi':2999}
    obj3 = Series(sdata)
    print obj3
    
    nam     2000
    ohii    3000
    wyi     2999
    dtype: int64
    

    利用index后添标签(或修改),用isnull和notnull判断缺失数据

    states={'ohii','nam','wyi','ckla'}
    obj4 = Series(sdata,index=states)#无对应键值就输出NaN
    print obj4
    print isnull(obj4)
    print notnull(obj4)
    print obj3+obj4#会自动对齐
    
    ckla       NaN
    ohii    3000.0
    wyi     2999.0
    nam     2000.0
    dtype: float64
    ----------------------------------
    ckla     True
    ohii    False
    wyi     False
    nam     False
    dtype: bool
    ----------------------------------
    ckla    False
    ohii     True
    wyi      True
    nam      True
    dtype: bool
    ----------------------------------
    ckla       NaN
    nam     4000.0
    ohii    6000.0
    wyi     5998.0
    dtype: float64
    

    Series对象本身及索引都有一个name属性,该属性和pandas其他的关键功能关系非常密切

    obj4.name = 'population'
    obj4.index.name = 'state'
    print obj4
    
    state#索引
    ckla       NaN
    ohii    3000.0
    wyi     2999.0
    nam     2000.0
    Name: population, dtype: float64
    

    扯淡

    今天研究生开题,没时间多做其他的,本来想着吧knn窗口化实现一下,可惜今天没时间咯,还好老师人很好,学渣侥幸开题成功,叮~您的假期已充费!


    这里写图片描述

    BTW

    我是按照->利用python进行数据分析<-来学习的,这本书非常好的(听说),还有就是,可能pandas涉及到不在那么大众,所以有些词不知道意思还是建议查官方文档,这里给个官文pandas速查手册


    Day 2

    DataFrame的使用

    • 通过字典建立DataFrame
    In[20]: from pandas import *
    data = {
            'state':['ohio','ohio','nevada','nevada'],
            'year':[2000,2001,2003,2002],
            'pop':[1.5,1.6,3.6,2.9]
            }
    
    frame = DataFrame(data) # 不规定的话就columns随机排,index默认为0,1,2...
    
    In[21]: frame
    
    Out[21]: 
       pop   state  year
    0  1.5    ohio  2000
    1  1.6    ohio  2001
    2  3.6  nevada  2003
    3  2.9  nevada  2002
    

    • 指定索引位置
    In[22]: DataFrame(data,columns=['year','state','pop']) #按照规定顺序排序
    
    Out[22]: 
       year   state  pop
    0  2000    ohio  1.5
    1  2001    ohio  1.6
    2  2003  nevada  3.6
    3  2002  nevada  2.9
    

    • 指定检索,未指定则被按照NaN处理
    In[24]: frame2 = DataFrame(data,columns=['year','state','pop','somethingNone'],index=['one','two','three','four']) # 自己安排columns和index,columns检索不到的按照NaN处理,和Series一样
    
    In[25]: frame2
    
    Out[25]: 
           year   state  pop somethingNone
    one    2000    ohio  1.5           NaN
    two    2001    ohio  1.6           NaN
    three  2003  nevada  3.6           NaN
    four   2002  nevada  2.9           NaN
    

    • 获取column包含的内容,检索列
    In[26]: frame2['state'] #检索,获取为一个Series
    
    Out[26]: 
    one        ohio
    two        ohio
    three    nevada
    four     nevada
    Name: state, dtype: object
    

    • 检索行,注意语法Obj.ix['index']
    In[27]: frame2.ix['three'] #索引index的时候注意
    
    Out[27]: 
    year               2003
    state            nevada
    pop                 3.6
    somethingNone       NaN
    Name: three, dtype: object
    

    • 类似字典的赋值操作
    In[30]: frame2['somethingNone'] = 10 #直接可赋值操作
    
    In[30]: frame2
    
    Out[30]: 
           year   state  pop  somethingNone
    one    2000    ohio  1.5             10
    two    2001    ohio  1.6             10
    three  2003  nevada  3.6             10
    four   2002  nevada  2.9             10
    

    • 使用Series创建DataFrame
    In[34]: val = Series([-1.2,-1.5],index = ['two','four']) # 如果赋值为Series的话,注意index位置及大小
    
    In[35]: frame2
    
    Out[35]: 
           year   state  pop  somethingNone
    one    2000    ohio  1.5            NaN
    two    2001    ohio  1.6           -1.2
    three  2003  nevada  3.6            NaN
    four   2002  nevada  2.9           -1.5
    

    • 删除列columns操作
    In[47]: del frame2['somethingNone'] # 删除columns操作,
    
    In[48]: frame.columns
    
    Out[48]: Index([u'pop', u'state', u'year'], dtype='object')
    

    • 多层字典创建DataFrame
    In[50]: pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
    
    In[51]: frame3 = DataFrame(pop) # 字典的字典创建DataFrame
    
    In[52]: frame3 #外层字典作为列,内层作为行索引index
    
    Out[52]: 
          Nevada  Ohio
    2000     NaN   1.5
    2001     2.4   1.7
    2002     2.9   3.6
    

    • DataFrame转置操作
    In[53]: frame3.T #转置操作
    
    Out[53]: 
            2000  2001  2002
    Nevada   NaN   2.4   2.9
    Ohio     1.5   1.7   3.6
    

    • 由Series组成的字典构建DataFrame
    In[54]: pdata = {'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]} #Series组成的字典也可以DataFrame化,注意切片操作
    
    In[55]: DataFrame(pdata)
    
    Out[55]: 
          Nevada  Ohio
    2000     NaN   1.5
    2001     2.4   1.7
    

    • 添加index和columns名字属性
    
    In[56]: frame3.index.name = 'year';frame3.columns.name = 'state'
    
    In[57]: frame3
    
    Out[57]: 
    state  Nevada  Ohio
    year               
    2000      NaN   1.5
    2001      2.4   1.7
    2002      2.9   3.6
    

    Day 3

    index的使用

    构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转化成为一个Index

    首选看一下index有哪些方法

    index的方法和属性
    • 构建Series
    In[3]: obj = Series(range(3),index = ['a','b','c'])
    In[4]: obj
    
    Out[4]: 
    a    0
    b    1
    c    2
    dtype: int64
    
    
    • 获取index对象
    
    In[5]: index = obj.index
    In[6]: index
    
    Out[6]: Index([u'a', u'b', u'c'], dtype='object')
    
    In[7]: index[1:] #切片
    
    Out[7]: Index([u'b', u'c'], dtype='object')
    
    In[11]: 'a' in obj.index
    
    Out[11]: True
    
    • 创建新的Series有序对象
    In[14]: obj2 = Series(range(3),index = ['d','e','f'])
    
    In[15]: index2 = obj2.index
    
    
    • 连接另一个index对象
    
    In[19]: index3 = index.append(index2) #连接另一个index对象,产生新的index
    
    In[20]: index3
    
    Out[20]: Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
    
    • 判断index中元素是否唯一
    In[23]: index3.is_unique #index是否有唯一
    
    Out[23]: True
    
    In[24]: index3.unique() #计算唯一值的数组
    
    Out[24]: array(['a', 'b', 'c', 'd', 'e', 'f'], dtype=object)
    
    • 计算index3和index2的不同即差值
    In[25]: index3.diff(index2) #计算差值
    C:\Program Files (x86)\JetBrains\PyCharm 5.0.3\helpers\pydev\pydevconsole.py:1: FutureWarning: diff is deprecated. Use difference instead
    
    Out[25]:   from _pydev_imps._pydev_thread import start_new_thread #提示需要导入包
    Index([u'a', u'b', u'c'], dtype='object')
    
    
    • 计算index和index2的并集
    
    In[26]: index.union(index2) #计算并集
    
    Out[26]: Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
    
    • 从index中删除元素,注意不改变原来的index,而是构建新的index
    In[28]: index3.delete(3) #删除索引i处的元素
    
    Out[28]: Index([u'a', u'b', u'c', u'e', u'f'], dtype='object') #即删除了第四个索引元素
    
    In[29]: index3 #但是对index3本身并不起作用,还是符合index不可修改的原则
    
    Out[29]: Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
    
    
    • drop方法,丢弃指定轴上的项
    
    In[31]: index3.drop('a') #删除传入的值,根据index名字来进行删除操作
    
    Out[31]: Index([u'b', u'c', u'd', u'e', u'f'], dtype='object')
    

    reindex的使用

    作用是创建一个适应新索引的新对象,同样不改变原来的索引,而产生一个新的对象


    • Series的reindex的使用
    In[43]: obj
    
    Out[43]: 
    a    0
    b    1
    c    2
    dtype: int64
    
    In[44]: obj3 = obj.reindex(['1','2','3','a','b']) #重新根据索引进行排序,对某个索引不存在时,默认用NaN填充,也可以用fill_value确定缺省值,用ffill方法向前填充
    
    In[45]: obj3
    
    Out[45]: 
    1    NaN
    2    NaN
    3    NaN
    a    0.0
    b    1.0
    dtype: float64
    
    • 用fill_value确定缺省值
    In[47]: obj4 = obj.reindex(['1','2','3','a','b'],fill_value = 'Fill_Value')
    In[48]: obj4
    
    Out[48]: 
    1    Fill_Value
    2    Fill_Value
    3    Fill_Value
    a             0
    b             1
    dtype: object
    
    • 使用ffill方法实现向前填充缺省值,bfill为向后填充
    In[49]: obj5 = Series(['A','C','E'],index = [0,2,4])
    In[50]: obj5
    
    Out[50]: 
    0    A
    2    C
    4    E
    dtype: object
    
    In[51]: obj5.reindex(range(6),method = 'ffill')
    
    Out[51]: 
    0    A
    1    A
    2    C
    3    C
    4    E
    5    E
    dtype: object
    
    

    - DataFrame的reindex的使用

    
    #首先看一下构造
    In[52]: np.arange(9)
    Out[52]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    
    In[53]: np.arange(9).reshape((3,3))
    Out[53]: 
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    
    #了解结构之后构建DataFrame
    
    In[54]: frame = DataFrame(np.arange(9).reshape((3,3)),index=['a','b','c'],columns=['Ohio','Texas','California'])
    
    In[55]: frame
    
    Out[55]: 
       Ohio  Texas  California
    a     0      1           2
    b     3      4           5
    c     6      7           8
    
    
    • 对DataFrame对象进行重新索引
    
    In[59]: frame3 = frame.reindex(['a','c','b','new'])
    
    In[60]: frame3
    Out[60]: 
         Ohio  Texas  California
    a     0.0    1.0         2.0
    c     6.0    7.0         8.0
    b     3.0    4.0         5.0
    new   NaN    NaN         NaN
    
    
    • ix的标签检索功能,内部参数传入注意形式,检索不到的值用NaN填充
    
    In[61]: frame3.ix[['a','c','new'],['Ohio','NewYork','California']] #利用ix的标签检索功能
    Out[61]: 
         Ohio  NewYork  California
    a     0.0      NaN         2.0
    c     6.0      NaN         8.0
    new   NaN      NaN         NaN
    

    Pay Attention

    1.Index对象是不可改变的,用户不能对其进行修改,对Index的操作都会产生一个新的Index,对原来的Index并不修改。比如说,拿一个list来说

    list的append方法

    In[67]: a = ['1','2','3']
    In[68]: a.append('4')
    In[69]: a
    
    Out[69]: ['1', '2', '3', '4'] # a已经被改变
    

    index的append方法,其余方法类似

    In[70]: index
    Out[70]: Index([u'a', u'b', u'c'], dtype='object')
    
    In[71]: index2
    Out[71]: Index([u'd', u'e', u'f'], dtype='object')
    
    In[72]: index.append(index2)
    Out[72]: Index([u'a', u'b', u'c', u'd', u'e', u'f'], dtype='object')
    
    In[73]: index
    Out[73]: Index([u'a', u'b', u'c'], dtype='object') #可见index并没有改变,
    

    2.Obj.ix[[],[]...]标签索引功能的使用,举个栗子

    假设frame是如下

    In[75]: frame
    Out[75]: 
       Ohio  Texas  California
    a     0      1           2
    b     3      4           5
    c     6      7           8
    

    开始索引

    In[77]: frame.ix['a'] #把index为a的索引出来,构成Series
    
    Out[77]: 
    Ohio          0
    Texas         1
    California    2
    Name: a, dtype: int32
    

    多条件索引

    In[80]: frame.ix['a','California']
    
    Out[80]: 2
    

    致谢

    利用python进行数据分析.Wes McKinney

    相关文章

      网友评论

        本文标题:pandas入门(持续更新)

        本文链接:https://www.haomeiwen.com/subject/rdzhettx.html