• pandas基础--层次化索引


    以下代码的前提:import pandas as pd

    层次化索引使你能在一个轴上拥有多个(两个以上)索引级别。抽象的说,它使你能以低维度形式处理高维度数据。

     1 >>> data = pd.Series(np.random.randn(10), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
     2 >>> data  
     3 a  1    3.230188
     4    2    0.596511
     5    3    0.956307
     6 b  1    1.132221
     7    2    0.746174
     8    3    0.470007
     9 c  1    0.880883
    10    2    0.757047
    11 d  2   -0.028331
    12    3    0.382625
    13 dtype: float64
    14 >>> data.index #带MultiIndex索引的Series的格式化输出形式,索引之间的“间隔”表示“直接使用上面的标签”
    15 MultiIndex([('a', 1),
    16             ('a', 2),
    17             ('a', 3),
    18             ('b', 1),
    19             ('b', 2),
    20             ('b', 3),
    21             ('c', 1),
    22             ('c', 2),
    23             ('d', 2),
    24             ('d', 3)],
    25            )
    26 >>> data['b']  #选取数据子集
    27 1    1.132221
    28 2    0.746174
    29 3    0.470007
    30 dtype: float64
    31 >>> data['b': 'c'] 
    32 b  1    1.132221
    33    2    0.746174
    34    3    0.470007
    35 c  1    0.880883
    36    2    0.757047
    37 dtype: float64
    38 >>> data.loc[['b', 'd']] 
    39 b  1    1.132221
    40    2    0.746174
    41    3    0.470007
    42 d  2   -0.028331
    43    3    0.382625
    44 dtype: float64
    45 >>> data[:, 2]  #在“内层”中进行选取
    46 a    0.596511
    47 b    0.746174
    48 c    0.757047
    49 d   -0.028331
    50 dtype: float64

    层次索引在数据重塑和基于和基于分组的操作(如透视表生成)中有重要作用。如可以通过unstack方法重新安排多层数据到一个DataFrame中。

     1 >>> data
     2 a  1    3.230188
     3    2    0.596511
     4    3    0.956307
     5 b  1    1.132221
     6    2    0.746174
     7    3    0.470007
     8 c  1    0.880883
     9    2    0.757047
    10 d  2   -0.028331
    11    3    0.382625
    12 dtype: float64
    13 >>> data.unstack()
    14           1         2         3
    15 a  3.230188  0.596511  0.956307
    16 b  1.132221  0.746174  0.470007
    17 c  0.880883  0.757047       NaN
    18 d       NaN -0.028331  0.382625
    19 >>> data.unstack().stack()  #stack使unstack的逆运算
    20 a  1    3.230188
    21    2    0.596511
    22    3    0.956307
    23 b  1    1.132221
    24    2    0.746174
    25    3    0.470007
    26 c  1    0.880883
    27    2    0.757047
    28 d  2   -0.028331
    29    3    0.382625
    30 dtype: float64

    对于一个DataFrame,每条轴都可以分成索引,每层都可以由名字(可能是字符串,也可以是别的python对象)。如果指定了名字,它们就会显示在控制台输出中。

     1 >>> frame = pd.DataFrame(np.arange(12).reshape((4, 3)), index=[['a', 'a', 'b', 'b'], [1, 2, 1, 
     2 -2]], columns=[['Oh', 'Oh', 'Co'], ['Gr', 'Re', 'Gr']])
     3 >>> frame
     4      Oh      Co
     5      Gr  Re  Gr
     6 a  1  0   1   2
     7    2  3   4   5
     8 b  1  6   7   8
     9   -2  9  10  11
    10 >>> frame.index.names = ['key1', 'key2']
    11 >>> frame.columns.names = ['state', 'color'] 
    12 >>> frame
    13 state     Oh      Co
    14 color     Gr  Re  Gr
    15 key1 key2
    16 a     1    0   1   2
    17       2    3   4   5
    18 b     1    6   7   8
    19      -2    9  10  11
    20 >>> frame['Oh'] 
    21 color      Gr  Re
    22 key1 key2
    23 a     1     0   1
    24       2     3   4
    25 b     1     6   7
    26      -2     9  10

    1.1 重排分级排序

    有时需要调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(当数据不会发生变化)。

     1 >>> frame
     2 state     Oh      Co
     3 color     Gr  Re  Gr
     4 key1 key2
     5 a     1    0   1   2
     6       2    3   4   5
     7 b     1    6   7   8
     8      -2    9  10  11
     9 >>> frame.swaplevel('key1', 'key2')
    10 state     Oh      Co
    11 color     Gr  Re  Gr
    12 key2 key1
    13  1   a     0   1   2
    14  2   a     3   4   5
    15  1   b     6   7   8
    16 -2   b     9  10  11

    1.2  根据级别汇总统计

    许多对DataFrame和Series的描述和汇总统计都有一个level选项,用于指定在某条轴上求和的级别。

     1 >>> frame 
     2 state     Oh      Co
     3 color     Gr  Re  Gr
     4 key1 key2
     5 a     1    0   1   2
     6       2    3   4   5
     7 b     1    6   7   8
     8      -2    9  10  11
     9 >>> frame.sum(level='key2')
    10 state Oh      Co
    11 color Gr  Re  Gr
    12 key2
    13  1     6   8  10
    14  2     3   4   5
    15 -2     9  10  11
    16 >>> frame.sum(level='color', axis=1) 
    17 color      Gr  Re
    18 key1 key2
    19 a     1     2   1
    20       2     8   4
    21 b     1    14   7
    22      -2    20  10
    23 >>>

    1.3 使用DataFrame的列

    经常将DataFrame的一个或多个列当作行索引来使用,或者希望将行索引变成DataFrame的列。

    DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。

     1 >>> frame = pd.DataFrame({'a': range(7), 'b': range(7, 0, -1), 'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'], 'd': [0, 1, 2, 0, 1, 2, 3]})
     2 >>> frame
     3    a  b    c  d
     4 0  0  7  one  0
     5 1  1  6  one  1
     6 2  2  5  one  2
     7 3  3  4  two  0
     8 4  4  3  two  1
     9 5  5  2  two  2
    10 6  6  1  two  3
    11 >>> frame2 = frame.set_index(['c', 'd'])  
    12 >>> frame2
    13        a  b
    14 c   d
    15 one 0  0  7
    16     1  1  6
    17     2  2  5
    18 two 0  3  4
    19     1  4  3
    20     2  5  2
    21     3  6  1
    22 >>> frame.set_index(['c', 'd'], drop=False)  #可选择保留那些列
    23        a  b    c  d
    24 c   d
    25 one 0  0  7  one  0
    26     1  1  6  one  1
    27     2  2  5  one  2
    28 two 0  3  4  two  0
    29     1  4  3  two  1
    30     2  5  2  two  2
    31     3  6  1  two  3

    reset_index的功能和set_index刚好相反、层次化索引的级别会被转移到列里面:

     1 >>> frame2 
     2        a  b
     3 c   d
     4 one 0  0  7
     5     1  1  6
     6     2  2  5
     7 two 0  3  4
     8     1  4  3
     9     2  5  2
    10     3  6  1
    11 >>> frame2.reset_index() 
    12      c  d  a  b
    13 0  one  0  0  7
    14 1  one  1  1  6
    15 2  one  2  2  5
    16 3  two  0  3  4
    17 4  two  1  4  3
    18 5  two  2  5  2
    19 6  two  3  6  1
  • 相关阅读:
    android四大组件--ContentProvider具体解释
    C语言指针的初始化和赋值
    微信游戏《全民炫舞》公司的引擎开发和布料系统技术介绍
    Struts2自己定义拦截器实例—登陆权限验证
    数据仓库与数据挖掘的一些基本概念
    acm省赛选拔组队赛经验谈
    【我所认知的BIOS】—> uEFI AHCI Driver(5) — 第一个protocol最终要開始安装了
    ios项目开发(天气预报项目):使用正则获取 weather.com.cn站点信息
    每日总结-05-16(再见强哥有感)
    编程算法基础-2.7作业-通讯编码-格式检查
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/12256500.html
Copyright © 2020-2023  润新知