《利用python进行数据分析》之层次化索引

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mr_muli/article/details/84193574
  • 《利用python进行数据分析》之层次化索引
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 17 20:36:14 2018

@author: muli
"""

from pandas import Series,DataFrame
import pandas as pd
import numpy as np


#层次化索引
#层次化索引,是你能在一个轴上拥有多个(两个以上)索引级别。
#即能以低纬度形式处理高纬度数据

data=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]])

print(data)
print("------------")
print(data.index)
print("============")
print(data['d'])
print("------------")

# 外层抽取
print(data["b":"d"])
# 此种形式不能用":"分割
print(data.ix[['b','c','d']])
print("----------------")

# 甚至还可以在“内层”中进行选取:
# [a,b]: a表示外层索引,b表示内层索引
# 有过滤选取的意思
print(data[:,3])

print("----------")

# 层次化索引的在数据重塑和基于分组的操作(如透视表生成)中扮演重要角色
# 比如说,这段数据可以通过unstack方法被重新安排到一个DataFrame中
print(data.unstack())
print("---------")
# unstack的逆运算是stack:
print(data.unstack().stack())

print("*******************************")

# 对于一个DataFrame,每条轴都可以分层索引:
frame=DataFrame(np.arange(12).reshape((4,3)),
                index=[['a','a','b','b'],
                       [1,2,1,2]],
                columns=[['Ohio','Ohio','Colorado'],
                         ['Green','Red','Green']])

print(frame)
print("-----")
# 此种形式,只能针对 列 的外层索引
print(frame['Colorado'])
print("------------------")
# 针对 行 的索引,只能用ix[]函数
print(frame.ix['a'])
print("**********")

# 如果需要提取内层的数据,需要分层提取
# 先提取外层数据,然后赋值给新的变量,然后再进行提取
frame2=frame['Ohio']
print(frame2)
print("^^^^^^^^^^^^^")
print(frame2["Green"])

print("**********")
frame.index.names=['key1','key2']
frame.columns.names=['state','color']

print(frame)

#可以单独的创建MultiIndex 然后复用,上面那个DataFrame中的(分级)列可以这样创建:
#MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],
#                        ['Green','Red','Green']],
#                        names=['state','color'])

print("$$-----------$$")

# 重排分级顺序
# 如果需要调整某条轴上各级别的顺序,或根据指定界级别上的值对数据进行排序。
# swaplevel接受两个级别编号或名称,并返回一个互换级别的新对象(但数据不会发生变化)
frame3=frame.swaplevel('key1','key2')
#frame3=frame.swaplevel('state','color')
print(frame3)

print("---------------------")

# 而sortleval则根据单个级别中的值对数据进行排序(稳定的)。
# 交流级别时,常常也会用到sortlevel,这样最终的结果就是有序的了:
frame4=frame.sortlevel(1)
print(frame4)
print("---------")

# sortlevel(0):按照外层索引分
print(frame.swaplevel(0,1).sortlevel(0))
#state      Ohio     Colorado
#color     Green Red    Green
#key2 key1                   
#1    a        0   1        2
#     b        6   7        8
#2    a        3   4        5
#     b        9  10       11

# sortlevel(0):按照内层索引分
print(frame.swaplevel(0,1).sortlevel(1))
#state      Ohio     Colorado
#color     Green Red    Green
#key2 key1                   
#1    a        0   1        2
#2    a        3   4        5
#1    b        6   7        8
#2    b        9  10       11

print("++++++++++++++++++++++++++++++")
# swaplevel('key1','key2') 为自定义
# swaplevel(0,1) 为原始状态
print(frame.swaplevel('key1','key2').sortlevel(0))
print("++++++++++++++++++++++++++++++")
print(frame)
print("----------------")

#根据级别汇总统计
#许多对DataFrame 和Series的描述和汇总统计都有一个leve选项,用于指定在某条轴上对求和的级别,
#再也上面的那个DataFrame为例子,我们根据行或列上的级别进行求和
# 行:外层
print(frame.sum(level='key1'))
print("------")
# 行:内层
print(frame.sum(level='key2'))
print("------")



# 列: 外层
print(frame.sum(level='state',axis=1))
print("------")
# 列: 内层
print(frame.sum(level='color',axis=1))

猜你喜欢

转载自blog.csdn.net/mr_muli/article/details/84193574
今日推荐