版权声明:本文为博主原创文章,未经博主允许不得转载。 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))