Pandas - 索引和选择数据

  • 简述

    在本章中,我们将讨论如何对日期进行切片和切块,以及如何获取 pandas 对象的子集。
    Python 和 NumPy 索引运算符“[]”和属性运算符“.” 在广泛的用例中提供对 Pandas 数据结构的快速轻松访问。但是,由于事先不知道要访问的数据的类型,因此直接使用标准运算符有一些优化限制。对于生产代码,我们建议您利用本章中介绍的优化的 pandas 数据访问方法。
    Pandas 现在支持三种类型的多轴索引;下表中提到了这三种类型 -
    序号 索引和描述
    1
    .loc()
    基于标签
    2
    .iloc()
    基于整数
    3
    .ix()
    基于标签和整数
  • .loc()

    熊猫提供了各种方法来纯粹label based indexing. 切片时,还包括起始边界。整数是有效的标签,但它们指的是标签而不是位置。
    .loc()有多种访问方法,如 -
    • 单个标量标签
    • 标签列表
    • 切片对象
    • 布尔数组
    loc采用两个由“,”分隔的单/列表/范围运算符。第一个表示行,第二个表示列。

    示例 1

    
    #import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4),
    index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
    #select all rows for a specific column
    print df.loc[:,'A']
    
    它的输出如下 -
    
    a   0.391548
    b  -0.070649
    c  -0.317212
    d  -2.162406
    e   2.202797
    f   0.613709
    g   1.050559
    h   1.122680
    Name: A, dtype: float64
    

    示例 2

    
    # import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4),
    index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
    # Select all rows for multiple columns, say list[]
    print df.loc[:,['A','C']]
    
    它的输出如下 -
    
                A           C
    a    0.391548    0.745623
    b   -0.070649    1.620406
    c   -0.317212    1.448365
    d   -2.162406   -0.873557
    e    2.202797    0.528067
    f    0.613709    0.286414
    g    1.050559    0.216526
    h    1.122680   -1.621420
    

    示例 3

    
    # import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4),
    index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
    # Select few rows for multiple columns, say list[]
    print df.loc[['a','b','f','h'],['A','C']]
    
    它的输出如下 -
    
               A          C
    a   0.391548   0.745623
    b  -0.070649   1.620406
    f   0.613709   0.286414
    h   1.122680  -1.621420
    

    示例 4

    
    # import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4),
    index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
    # Select range of rows for all columns
    print df.loc['a':'h']
    
    它的输出如下 -
    
                A           B          C          D
    a    0.391548   -0.224297   0.745623   0.054301
    b   -0.070649   -0.880130   1.620406   1.419743
    c   -0.317212   -1.929698   1.448365   0.616899
    d   -2.162406    0.614256  -0.873557   1.093958
    e    2.202797   -2.315915   0.528067   0.612482
    f    0.613709   -0.157674   0.286414  -0.500517
    g    1.050559   -2.272099   0.216526   0.928449
    h    1.122680    0.324368  -1.621420  -0.741470
    

    示例 5

    
    # import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4),
    index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
    # for getting values with a boolean array
    print df.loc['a']>0
    
    它的输出如下 -
    
    A  False
    B  True
    C  False
    D  False
    Name: a, dtype: bool
    
  • .loc ()

    Pandas 提供了各种方法来获得基于整数的索引。像 python 和 numpy 一样,这些是0-based索引。
    各种访问方法如下 -
    • 一个整数
    • 整数列表
    • 范围值

    示例 1

    
    # import the pandas library and aliasing as pd
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    # select all rows for a specific column
    print df.iloc[:4]
    
    它的输出如下 -
    
               A          B           C           D
    0   0.699435   0.256239   -1.270702   -0.645195
    1  -0.685354   0.890791   -0.813012    0.631615
    2  -0.783192  -0.531378    0.025070    0.230806
    3   0.539042  -1.284314    0.826977   -0.026251
    

    示例 2

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    # Integer slicing
    print df.iloc[:4]
    print df.iloc[1:5, 2:4]
    
    它的输出如下 -
    
               A          B           C           D
    0   0.699435   0.256239   -1.270702   -0.645195
    1  -0.685354   0.890791   -0.813012    0.631615
    2  -0.783192  -0.531378    0.025070    0.230806
    3   0.539042  -1.284314    0.826977   -0.026251
               C          D
    1  -0.813012   0.631615
    2   0.025070   0.230806
    3   0.826977  -0.026251
    4   1.423332   1.130568
    

    示例 3

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    # Slicing through list of values
    print df.iloc[[1, 3, 5], [1, 3]]
    print df.iloc[1:3, :]
    print df.iloc[:,1:3]
    
    它的输出如下 -
    
               B           D
    1   0.890791    0.631615
    3  -1.284314   -0.026251
    5  -0.512888   -0.518930
               A           B           C           D
    1  -0.685354    0.890791   -0.813012    0.631615
    2  -0.783192   -0.531378    0.025070    0.230806
               B           C
    0   0.256239   -1.270702
    1   0.890791   -0.813012
    2  -0.531378    0.025070
    3  -1.284314    0.826977
    4  -0.460729    1.423332
    5  -0.512888    0.581409
    6  -1.204853    0.098060
    7  -0.947857    0.641358
    
  • .ix ()

    除了基于纯标签和基于整数之外,Pandas 还提供了一种使用 .ix() 运算符选择和子集对象的混合方法。

    示例 1

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    # Integer slicing
    print df.ix[:4]
    
    它的输出如下 -
    
               A          B           C           D
    0   0.699435   0.256239   -1.270702   -0.645195
    1  -0.685354   0.890791   -0.813012    0.631615
    2  -0.783192  -0.531378    0.025070    0.230806
    3   0.539042  -1.284314    0.826977   -0.026251
    

    示例 2

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    # Index slicing
    print df.ix[:,'A']
    
    它的输出如下 -
    
    0   0.699435
    1  -0.685354
    2  -0.783192
    3   0.539042
    4  -1.044209
    5  -1.415411
    6   1.062095
    7   0.994204
    Name: A, dtype: float64
    
  • 符号的使用

    使用多轴索引从 Pandas 对象中获取值使用以下符号 -
    目的 索引器 返回类型
    Series s.loc[indexer] 标量值
    DataFrame df.loc[row_index,col_index] 系列对象
    Panel p.loc[item_index,major_index,minor_index] p.loc[item_index,major_index,minor_index]
    注意 − .iloc() & .ix()应用相同的索引选项和返回值。
    现在让我们看看如何在 DataFrame 对象上执行每个操作。我们将使用基本的索引运算符 '[ ]' -

    示例 1

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    print df['A']
    
    它的输出如下 -
    
    0  -0.478893
    1   0.391931
    2   0.336825
    3  -1.055102
    4  -0.165218
    5  -0.328641
    6   0.567721
    7  -0.759399
    Name: A, dtype: float64
    
    注意− 我们可以将值列表传递给 [ ] 以选择这些列。

    示例 2

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    print df[['A','B']]
    
    它的输出如下 -
    
               A           B
    0  -0.478893   -0.606311
    1   0.391931   -0.949025
    2   0.336825    0.093717
    3  -1.055102   -0.012944
    4  -0.165218    1.550310
    5  -0.328641   -0.226363
    6   0.567721   -0.312585
    7  -0.759399   -0.372696
    

    示例 3

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    print df[2:2]
    
    它的输出如下 -
    
    Columns: [A, B, C, D]
    Index: []
    

    属性访问

    可以使用属性运算符“.”来选择列。

    例子

    
    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
    print df.A
    
    它的输出如下 -
    
    0   -0.478893
    1    0.391931
    2    0.336825
    3   -1.055102
    4   -0.165218
    5   -0.328641
    6    0.567721
    7   -0.759399
    Name: A, dtype: float64