美文网首页Python可以做的那些事!码农的世界程序员
利用Python进行数据分析(六)之pandas基本功能

利用Python进行数据分析(六)之pandas基本功能

作者: BrainZou | 来源:发表于2017-12-12 20:16 被阅读38次

    pandas的基本功能

    重新索引

    不存在的索引都用同一个值填充:

    obj.reindex(['a','b','c','d','e'],fill_value=0)
    out:
    a   -5.3
    b   7.2
    C   3.6
    d   4.5
    e   0.0
    #如果没有fill_value则不存在的索引用NaN缺失值引入。
    

    对于有序索引,range(6)或者['a','b','c','d','e','f']。
    用前向值填充:method =‘ffill’或者method = 'pad' 前面没有则NaN
    用后向值填充:method = 'bfill' 或者 method = 'backfill' 后面没有则NaN

    In [84]:obj3 = Series(['blue','purple','yellow'],index=[o,2,4])
    In [85]:obj3.reindex(range(6),method='ffill')
    0ut[85]:
    0   blue
    1   blue
    2   purple
    3   purple
    4   yellow
    5   yellow
    

    上面是Series上的重新索引,DataFrame上也很相似。只传入一个序列,则会重新索引行,使用columns可重新索引列。也可以通时都重新索引,但插值只能按行应用。

    In[92]:frame.reindex(index=['a','b','c,'d'],method='ffil1',
            columns=states)
    0ut[92]:
      Texas Utah California
    a   1   NaN     2
    b   1   NaN     2   
    #b这一行本来不存在  都用上一行的填充了
    C   4   NaN     5
    d   7   NaN     8
    

    简单的做法是使用ix如:

    In[93]:frame.ix[['a','b','c','d'],states]
    0ut[93]:
        Texas  Utah California
    a       1   NaN     2
    b       NaN NaN     NaN
    C       4   NaN     5
    d       7   NaN     8
    
    参数 说明
    index 用作索引的新序列。既可以是Index实例,也可以是其他序列型的Python数据结构。Index会被完全使用,就像没有任何复制一样
    method 插值(填充)方式
    fill_value 在重新索引的过程中,需要引入缺失值时使用的替代值
    limit 前向或后向填充时的最大填充量
    level 在Multilndex的指定级别上匹配简单索引,否则选取其子集
    copy 默认为True,无论如何都复制;如果为False,则新旧相等就不复制

    总结下reindex的参数:

    参数 说明
    index 用作索引的新序列。既可以是Index实例,也可以是其他序列型的Python数据结构。Index会被完全使用,就像没有任何复制一样
    method 插值(填充)方式
    fill_value 在重新索引的过程中,需要引入缺失值时使用的替代值
    limit 前向或后向填充时的最大填充量
    level 在Multilndex的指定级别上匹配简单索引,否则选取其子集
    copy 默认为True,无论如何都复制;如果为False,则新旧相等就不复制

    丢弃指定轴上的项

    obj.drop(['a','c'])

    data.drop(['Colorado','Ohio']) #默认0轴 即行索引

    data.drop('two',axis = 1)#指明1轴 即列

    索引,选取和过滤

    Series索引:obj[2:4](2和3) obj[['b','a','d']]
    obj[obj<2](可以把值小于2的都选出来)
    但是利用标签的切片运算有一定的不同,它的末端是包含的:

    obj['b':'c']
    out:b  1
        c  2
    

    DataFrame索引:

    In [112]:data = DataFrame(np.arange(16).reshape((4,4)),
                    index=[ohio','Colorado',‘Utah',‘New York'],
                    columns=['one','two',‘three',‘four])
    In[113]:data
    0ut[113]:
                one two three four
    0hio        0    1    2     3
    Colorado    4    5    6     7
    Utah        8    9    10    11
    New York    12  13    14    15
    
    In [115]:data[['three',‘one']]
    0ut[115]:
                three   one
    Ohio        2       o
    Colorado    6       4
    Utah        10      8
    New York    14      12
    #但是通过切片和布尔数组 选取的是行!!!
    In [116]:data[:2]
    0ut[116]:
                one two three four
    0hio        0   1   2       3   
    Colorado    4   5   6       7
    
    In[117]:data[data['three']>5]
    0ut[117]:
                one two three four
    Colorado    4   5    6      7   
    Utah        8   9   10      11
    New York    12  13  14      15
    

    另外一种通过data<5这种布尔型的结果。

    In [118]:data<5
    out[118]:
                one   two   three  four
    Ohio        True  True  True  True
    Colorado    True  False False False
    Utah        False False False False
    New York    False False False False
    In[119]:data[data<5]=o
    In[120]:data
    0ut[120]:
                one two three four
    ohio        o   o   o       o
    Colorado    0   5   6       7
    Utah        8   9   10      11
    New York    12  13  14      15
    

    感觉像不像之前的ndarray?

    复习见第二章节ndarray

    arr=np.arange(10)
    arr<5
    out:array([ True,True,Irue,True,True,False,False,False,False,False],dtype=bool)
    arr[arr <5]=5
    out:array([5,5,5,5,5,5,6,7,8,9])
    

    专门的索引字段ix用来选取行和列的子集。

    In[122]:data.ix[['Colorado','Utah'],[3,0,1]]
    0ut[122]:
            four one two
    Colorado 7    0   5
    Utah    11    8   9
    
    In [125]:data.ix[data.three>5,:3]
    0ut[125]:
                one two three
    Colorado     0   5    6
    Utah         8   9   10
    New York    12   13  14
    

    [图片上传失败...(image-a9f529-1513230768125)]

    [图片上传失败...(image-d253d7-1513230768125)]

    函数应用和映射

    NumPy的ufuncs操作pandas对象:
    np.abs(frame)#对每个值都取绝对值

    apply可以把函数用到各列或各行所形成的一维数组上:

    f = lambda x: x.max() - x.min()
    frame.apply(f)#取每列最大值与最小值的差值
    frame.apply(f,axis=1)#取每行最大值与最小值的差值
    def f(x):
        return Series([x.min(),x.max()],index=['min','max'])
    frame.apply(f)
    out:        b       d       e
    min -0.555730   0.281746    -1.296221
    max 1.246435    1.965781    1.393406
    

    还有此外,元素级的Python函数也是可以用的。假如你想得到frame中各个浮点值的格式化字符串,使用applymap即可:

    In[166]:format=lambda x:'%.2f'%x
    In[167]:frame.applymap(format)
    0ut[167]:
            b    d     e
    Utah  -0.20 0.48 -0.52
    Ohio  -0.56 1.97 1.39
    Texas  0.09 0.28 0.77
    0regon 1.25 1.01 -1.30
    之所以叫做applymap,是因为Series有一个用于应用元素级函数的map方法:
    In[168]:frame['e'].map(format)
    0ut[168]:
    Utah -0.52
    0hio 1.39
    Texas 0.77
    0regon -1.30
    Name:e
    

    总结:大部分还是pandas对Series,df的重新索引,以及索引和用函数选取你要的数据。

    ps.这两天写了个小爬虫,这两天脑子有点乱,所以写的乱七八糟的,小错误也犯了一堆。整理一下思路和代码,过两天发出来。实际写的时候发现之前的知识又生疏了...好尴尬,学的时候的感觉就是:对,不这么写怎么写,这格式就应该是这样的,这么写就能达到这种意思。 但是自己实际去两手空空的写的时候就是懵的...老是网上找资料,找格式啥的。估计还是用的太少,大家也应该学的时候多练多写,不会的多找资料。然后找个身边的能做的小的项目来练手,就能发现自己的差距了,继续努力!

    个人微信公众号:BrainZou

    相关文章

      网友评论

        本文标题: 利用Python进行数据分析(六)之pandas基本功能

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