美文网首页我爱编程
5.数据分析工具Pandas

5.数据分析工具Pandas

作者: 零_WYF | 来源:发表于2018-01-25 21:03 被阅读40次

    1. 什么是Pandas?

    Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
    Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    2. Pandas的数据结构

    2.1 Series

    Series是一种类似于一维数组的对象,组成:
    一组数据(各种NumPy数据类型)
    一组与之对应的索引(数据标签)
    索引(index)在左,数据(values)在右
    索引是自动创建的

    2.2 DataFrame

    一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,数据是以二维结构存放的。
    类似多维数组/表格数据 (如,excel, R中的data.frame)
    每列数据可以是不同的类型
    索引包括列索引和行索引

    3. 范例

    3.1 导入模块

    import pandas as pd
    

    3.2 通过list构建Series

    ser_obj1 = pd.Series(range(10,31))
    print(ser_obj1)
    # 打印前三行
    print(ser_obj1.head(3))
    #############运行结果##################
    0     10
    1     11
    2     12
    3     13
    4     14
    5     15
    6     16
    7     17
    8     18
    9     19
    10    20
    11    21
    12    22
    13    23
    14    24
    15    25
    16    26
    17    27
    18    28
    19    29
    20    30
    dtype: int64
    0    10
    1    11
    2    12
    dtype: int64
    #######################################
    

    3.3 通过dict构建Series

    dict = {"a":1,"b":2,"c":3}
    ser_obj2 = pd.Series(dict)
    print(ser_obj2)
    #############运行结果##################
    a    1
    b    2
    c    3
    dtype: int64
    #######################################
    

    3.4 获取数据和索引

    print(ser_obj2.values)
    print(ser_obj2.index
    #############运行结果##################
    [1 2 3]
    Index(['a', 'b', 'c'], dtype='object')
    #######################################
    

    3.5 通过索引获取数据

    print(ser_obj2["b"])
    print(ser_obj2[1])
    #############运行结果##################
    2
    2
    #######################################
    

    3.6 设置名称

    # 对象名
    ser_obj2.name = 'zero'
    # 对象索引名
    ser_obj2.index.name = 'wyf'
    print(ser_obj2.head())
    #############运行结果##################
    wyf
    a    1
    b    2
    c    3
    Name: zero, dtype: int64
    #######################################
    

    3.7 通过ndarray构建DataFrame

    import numpy as np
    arr_obj = np.random.rand(3,4)
    df_obj = pd.DataFrame(arr_obj)
    print(df_obj)
    print(df_obj.head(2)) # 查看前两行
    #############运行结果##################
              0         1         2         3
    0  0.267074  0.744870  0.021856  0.758293
    1  0.649231  0.119609  0.536336  0.503615
    2  0.561522  0.247207  0.280449  0.594249
              0         1         2         3
    0  0.267074  0.744870  0.021856  0.758293
    1  0.649231  0.119609  0.536336  0.503615
    #######################################
    

    3.8 通过dict构建DataFrame

    dict = {
        "A":1,
        "B":pd.Timestamp("20180124"),
        "C":pd.Series(range(10,14),dtype="float64"),
        "D":["python","java","c++","c"],
        "E":np.array([3]*4,dtype="int32"),
        "F":"zero",
    }
    df_obj = pd.DataFrame(dict)
    print(df_obj)
    #############运行结果##################
       A          B     C       D  E     F
    0  1 2018-01-24  10.0  python  3  zero
    1  1 2018-01-24  11.0    java  3  zero
    2  1 2018-01-24  12.0     c++  3  zero
    3  1 2018-01-24  13.0       c  3  zero
    #######################################
    

    3.9 通过列索引获取列数据

    print(df_obj['A'])
    print(type(df_obj['A']))
    print(df_obj.A)
    #############运行结果##################
    0    1
    1    1
    2    1
    3    1
    Name: A, dtype: int64
    <class 'pandas.core.series.Series'>
    0    1
    1    1
    2    1
    3    1
    Name: A, dtype: int64
    #######################################
    

    3.10 dataframe数据访问

    # 通过索引,先列后行
    print(df_obj['D'][0])
    # 查找指定元素,先找列,再找行
    print(df_obj.D[2])
    #############运行结果##################
    python
    c++
    #######################################
    

    3.11 增加列数据

    df_obj["G"] = "零"
    df_obj["H"] = df_obj["C"] + 10
    df_obj["I"] = df_obj["C"] * 3
    print(df_obj)
    #############运行结果##################
       A          B     C       D  E     F  G     H     I
    0  1 2018-01-24  10.0  python  3  zero  零  20.0  30.0
    1  1 2018-01-24  11.0    java  3  zero  零  21.0  33.0
    2  1 2018-01-24  12.0     c++  3  zero  零  22.0  36.0
    3  1 2018-01-24  13.0       c  3  zero  零  23.0  39.0
    #######################################
    

    3.12 删除列

    del df_obj["H"]
    print(df_obj.head())
    #############运行结果##################
       A          B     C       D  E     F  G     I
    0  1 2018-01-24  10.0  python  3  zero  零  30.0
    1  1 2018-01-24  11.0    java  3  zero  零  33.0
    2  1 2018-01-24  12.0     c++  3  zero  零  36.0
    3  1 2018-01-24  13.0       c  3  zero  零  39.0
    #######################################
    

    3.13 Series和DataFrame中的索引都是Index对象

    print(type(ser_obj.index))
    print(type(df_obj.index))
    #############运行结果##################
    <class 'pandas.core.indexes.range.RangeIndex'>
    <class 'pandas.core.indexes.range.RangeIndex'>
    #######################################
    

    3.14 index 指定行索引名

    # 不指定索引的话,默认从0开始
    ser_obj3 = pd.Series(range(5),index = ['a','b','c','d','e'])
    print(ser_obj3.head())
    #############运行结果##################
    a    0
    b    1
    c    2
    d    3
    e    4
    dtype: int64
    #######################################
    

    3.15 行索引

    print(ser_obj3['b'])
    print(ser_obj3[2])  # 索引号从0开始
    #############运行结果##################
    1
    2
    #######################################
    

    3.16 切片索引

    print(ser_obj3[1:3])
    print(ser_obj3['b':'d'])
    #############运行结果##################
    print(ser_obj3[1:3])
    print(ser_obj3['b':'d'])
    print(ser_obj3[1:3])
    print(ser_obj3['b':'d'])
    b    1
    c    2
    dtype: int64
    b    1
    c    2
    d    3
    dtype: int64
    #######################################
    

    3.17 不连续索引

    print(ser_obj3[[0,2,4]])
    print(ser_obj3[['a','c','e']])
    #############运行结果##################
    a    0
    c    2
    e    4
    dtype: int64
    a    0
    c    2
    e    4
    dtype: int64
    #######################################
    

    3.18 布尔索引

    ser_bool = ser_obj3 > 2 
    print(ser_bool)
    print(ser_obj3[ser_bool])
    print(ser_obj3[ser_obj3 > 2])
    #############运行结果##################
    a    False
    b    False
    c    False
    d     True
    e     True
    dtype: bool
    d    3
    e    4
    dtype: int64
    d    3
    e    4
    dtype: int64
    #######################################
    

    3.19 指定列索引名

    df_obj = pd.DataFrame(np.random.randn(5,4),columns=['a','b','c','d'])
    print(df_obj.head())
    #############运行结果##################
              a         b         c         d
    0  0.939462 -1.064223 -0.874885  1.180462
    1 -1.288067 -0.064089  0.855795  0.666919
    2 -0.339794  0.560721  0.550258 -0.576895
    3 -0.704544  0.622264  0.764208  0.106985
    4 -0.079751  0.930942  0.661030  1.267764
    #######################################
    

    3.20 列索引

    print(df_obj['b'])
    #############运行结果##################
    0    0.906177
    1    0.034646
    2    0.497803
    3    0.138119
    4    0.244221
    Name: b, dtype: float64
    #######################################
    

    3.21 不连续索引

    print(df_obj[['a','c']])
    #############运行结果##################
              a         c
    0  0.057483 -0.429583
    1  0.703981 -0.441183
    2 -1.043533  0.850768
    3  1.288697  0.242864
    4  0.000106 -0.333193
    #######################################
    

    3.22 loc标签索引

    print(ser_obj3['b':'d'])
    print(ser_obj3.loc['b':'d'])
    #############运行结果##################
    b    1
    c    2
    d    3
    dtype: int64
    b    1
    c    2
    d    3
    dtype: int64
    #######################################
    

    3.23 高级索引:标签、位置和混合

    print(df_obj['a'])
    #############运行结果##################
    0    0.939462
    1   -1.288067
    2   -0.339794
    3   -0.704544
    4   -0.079751
    Name: a, dtype: float64
    #######################################
    
    
    # 第一个参数是索引行,第二个参数是列
    print(df_obj.loc[0:2,'a'])
    print(df_obj.loc[1:3,['b','c']])
    print(df_obj.loc[1:3,'b':'d'])
    #############运行结果##################
    0    0.939462
    1   -1.288067
    2   -0.339794
    Name: a, dtype: float64
              b         c
    1 -0.064089  0.855795
    2  0.560721  0.550258
    3  0.622264  0.764208
              b         c         d
    1 -0.064089  0.855795  0.666919
    2  0.560721  0.550258 -0.576895
    3  0.622264  0.764208  0.106985
    #######################################
    
    

    3.24 iloc位置索引

    作用和loc一样,不过是基于索引编号来索引
    print(ser_obj3[1:3])
    print(ser_obj3.iloc[1:3])
    print(df_obj.iloc[0:2,0])
    #############运行结果##################
    b    1
    c    2
    dtype: int64
    b    1
    c    2
    dtype: int64
    0    0.939462
    1   -1.288067
    Name: a, dtype: float64
    #######################################
    

    3.25 ix标签与位置混合索引

    # Series
    print(ser_obj3.ix[1:3])
    print(ser_obj3.ix['b':'c'])
    #############运行结果##################
    b    1
    c    2
    dtype: int64
    b    1
    c    2
    dtype: int64
    #######################################
    
    # DataFrame
    print(df_obj.loc[0:2,'a'])
    print(df_obj.ix[0:2,0])
    #############运行结果##################
    0    0.939462
    1   -1.288067
    2   -0.339794
    Name: a, dtype: float64
    0    0.939462
    1   -1.288067
    2   -0.339794
    Name: a, dtype: float64
    #######################################
    

    3.26 Series的对其运算

    Series 按行、索引对其
    ser_obj4 = pd.Series(range(10,20),index = range(10))
    ser_obj5 = pd.Series(range(20,25),index = range(5))
    print(ser_obj4 + ser_obj5)
    #############运行结果##################
    0    30.0
    1    32.0
    2    34.0
    3    36.0
    4    38.0
    5     NaN
    6     NaN
    7     NaN
    8     NaN
    9     NaN
    dtype: float64
    #######################################
    
    print(ser_obj4)
    print(ser_obj5)
    print(ser_obj4.add(ser_obj5))
    # fill_value参数,将Series中未对齐的数据,填充为指定的值,一般指定为0,避免运算误差
    print(ser_obj4.add(ser_obj5,fill_value=0))
    #############运行结果##################
    0    10
    1    11
    2    12
    3    13
    4    14
    5    15
    6    16
    7    17
    8    18
    9    19
    dtype: int64
    0    20
    1    21
    2    22
    3    23
    4    24
    dtype: int64
    0    30.0
    1    32.0
    2    34.0
    3    36.0
    4    38.0
    5     NaN
    6     NaN
    7     NaN
    8     NaN
    9     NaN
    dtype: float64
    0    30.0
    1    32.0
    2    34.0
    3    36.0
    4    38.0
    5    15.0
    6    16.0
    7    17.0
    8    18.0
    9    19.0
    dtype: float64
    #######################################
    

    3.27 DataFrame按行、索引对齐

    df1 = pd.DataFrame(np.ones((2,2)),columns = ['a','b'])
    df2 = pd.DataFrame(np.ones((3,3)),columns = ['a','b','c'])
    print(df1.add(df2))
    print(df1.add(df2,fill_value=0))
    #############运行结果##################
         a    b   c
    0  2.0  2.0 NaN
    1  2.0  2.0 NaN
    2  NaN  NaN NaN
         a    b    c
    0  2.0  2.0  1.0
    1  2.0  2.0  1.0
    2  1.0  1.0  1.0
    #######################################
    

    3.28 可直接使用NumPy的函数

    df3 = pd.DataFrame(np.random.randn(5,4)-1)
    print(df3)
    # 绝对值
    print(np.abs(df3))
    #############运行结果##################
              0         1         2         3
    0 -0.229173 -2.923527 -2.111435 -2.289574
    1 -1.357054 -0.859935 -2.618068 -0.990787
    2 -0.618717 -0.277620 -1.687598 -0.201005
    3 -1.805256 -0.584533 -0.803320 -1.920048
    4 -0.703489  0.283588 -0.183795 -1.499259
              0         1         2         3
    0  0.229173  2.923527  2.111435  2.289574
    1  1.357054  0.859935  2.618068  0.990787
    2  0.618717  0.277620  1.687598  0.201005
    3  1.805256  0.584533  0.803320  1.920048
    4  0.703489  0.283588  0.183795  1.499259
    #######################################
    

    3.29 通过apply将函数应用到列或行上

    Axis参数可以指定轴向,默认值为0,方向是列,值为1:方向是行
    f = lambda x:x.max()
    print(df3.apply(f)) # 方向为列
    print(df3.apply(f,axis=1)) # 方向为行
    #############运行结果##################
    0   -0.229173
    1    0.283588
    2   -0.183795
    3   -0.201005
    dtype: float64
    0   -0.229173
    1   -0.859935
    2   -0.201005
    3   -0.584533
    4    0.283588
    dtype: float64
    #######################################
    

    3.30 通过applymap将函数应用到每个数据上,只用于DataFrame

    f1 = lambda x:'%.2f' % x
    print(df3.applymap(f1))
    f2 = lambda x:x+x
    print(df3.applymap(f2))
    #############运行结果##################
           0      1      2      3
    0  -0.23  -2.92  -2.11  -2.29
    1  -1.36  -0.86  -2.62  -0.99
    2  -0.62  -0.28  -1.69  -0.20
    3  -1.81  -0.58  -0.80  -1.92
    4  -0.70   0.28  -0.18  -1.50
              0         1         2         3
    0 -0.458346 -5.847054 -4.222869 -4.579149
    1 -2.714108 -1.719869 -5.236136 -1.981574
    2 -1.237435 -0.555239 -3.375196 -0.402010
    3 -3.610512 -1.169066 -1.606641 -3.840096
    4 -1.406977  0.567175 -0.367590 -2.998518
    #######################################
    

    3.31 排序

    索引排序
    # Series
    ser_obj6 = pd.Series(range(10,15),index=np.random.randint(5,size=5))
    print(ser_obj6)
    #############运行结果##################
    4    10
    1    11
    1    12
    0    13
    3    14
    dtype: int64
    #######################################
    
    # 降序排序
    print(ser_obj6.sort_index(ascending = False))
    #############运行结果##################
    4    10
    3    14
    1    11
    1    12
    0    13
    dtype: int64
    #######################################
    

    3.32 对DataFrame操作时注意轴方向,默认列,axis=1为行

    # DataFrame
    df_obj2 = pd.DataFrame(np.random.randn(3,5),
                           index = np.random.randint(3,size=3),
                          columns = np.random.randint(5,size=5))
    print(df_obj2)
    df_obj2_isort = df_obj2.sort_index(axis=1,ascending=False)
    print(df_obj2_isort)
    #############运行结果##################
              0         1         2         3         0
    1  0.557994  0.555874  1.899686 -1.334528  0.058536
    0 -0.013865 -1.234426 -0.527396 -0.864309  0.599536
    2  1.136960 -0.290542  0.452911  0.973588  1.445474
              3         2         1         0         0
    1 -1.334528  1.899686  0.555874  0.557994  0.058536
    0 -0.864309 -0.527396 -1.234426 -0.013865  0.599536
    2  0.973588  0.452911 -0.290542  1.136960  1.445474
    #######################################
    

    3.33 按值排序-Series对象

    # 创建随机Series对象
    ser_obj7 = pd.Series(np.random.randint(10,20,size=10))
    print(ser_obj7)
    print(ser_obj7.sort_values()) # 默认升序
    print(ser_obj7.sort_values(ascending = False)) # 降序 
    #############运行结果##################
    0    19
    1    17
    2    18
    3    18
    4    19
    5    13
    6    13
    7    16
    8    11
    9    12
    dtype: int32
    8    11
    9    12
    5    13
    6    13
    7    16
    1    17
    2    18
    3    18
    0    19
    4    19
    dtype: int32
    4    19
    0    19
    3    18
    2    18
    1    17
    7    16
    6    13
    5    13
    9    12
    8    11
    dtype: int32
    #######################################
    

    3.34 按值排序- DataFrame对象

    # 如果根据某一个行名/列名来排序,要保证没有其他相同的行名/列名,axis指定排序的轴方向
    df4 = pd.DataFrame(np.random.randn(3,5),
                      index = np.random.randint(3,size=3),
                      columns = np.random.randint(5,size=5))
    print(df4.sort_values(by=2))
    print(df4.sort_values(by=2,axis=1))
    #############运行结果##################
              0         0         3         0         2
    0  0.108904  2.141896  0.707657  1.146837 -0.016124
    0  0.265732 -0.789782 -0.575320 -0.993737  0.470039
    2 -0.080078  0.770228 -0.031199 -0.082614  1.062954
              0         0         3         0         2
    0  1.146837  0.108904  0.707657  2.141896 -0.016124
    0 -0.993737  0.265732 -0.575320 -0.789782  0.470039
    2 -0.082614 -0.080078 -0.031199  0.770228  1.062954
    #######################################
    

    3.35 处理缺失数据

    df_obj5 = pd.DataFrame([
        [1,2,np.nan,np.nan],
        [np.nan,3,4,np.nan],
        list(range(4))
    ])
    print(df_obj5)
    #############运行结果##################
         0  1    2    3
    0  1.0  2  NaN  NaN
    1  NaN  3  4.0  NaN
    2  0.0  1  2.0  3.0
    #######################################
    

    3,36 判断是否存在缺失值:isnull()

    # 判断是否nan值,如果是返回True,否则False
    print(df_obj5.isnull())
    #############运行结果###################
           0      1      2      3
    0  False  False   True   True
    1   True  False  False   True
    2  False  False  False  False
    #######################################
    

    3.37 丢弃缺失数据:dropna()

    # 根据axis轴方向,丢弃包含nan的行或者列
    print(df_obj5.dropna())
    print(df_obj5.dropna(axis=1))
    #############运行结果##################
         0  1    2    3
    2  0.0  1  2.0  3.0
       1
    0  2
    1  3
    2  1
    #######################################
    

    3.38 填充缺失数据:fillna()

    #将nan值替换为指定的值
    print(df_obj5.fillna(0))
    #############运行结果##################
         0  1    2    3
    0  1.0  2  0.0  0.0
    1  0.0  3  4.0  0.0
    2  0.0  1  2.0  3.0
    #######################################
    

    相关文章

      网友评论

        本文标题:5.数据分析工具Pandas

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