Pandas的多层索引

import numpy as np
from pandas import DataFrame, Series
import matplotlib.pyplot as plt
import pandas as pd


'''1.创建多层索引
1)隐式构造:最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
'''
# Series也可以创建多层索引
s = Series([1, 2, 3, 4], index=[["a", "a", "b", "b"], ["期中", "期末", "期中", "期末"]])
print(s)

# DataFrame创建多层索引
df = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["语文", "数学", "英语"],
               index=[["张三", "张三", "李四", "李四", "王五", "王五"],
                      ["Mid", "End", "Mid", "End", "Mid", "End"]])
print(df)


'''
2)显示构造pd.MultiIndex
'''
# 使用数组
df1 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_arrays([["张三", "张三", "李四", "李四", "王五", "王五"],
                          ["期中", "期末", "期中", "期末", "期中", "期末"]]))
print(df1)


# 使用tuple
df2 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_tuples([("张三", "期中"), ("张三", "期末"), ("李四", "期中"),
                                                ("李四", "期末"), ("王五", "期中"), ("王五","期末")]))
print(df2)


# 使用product 最简单,推荐使用
df3 = DataFrame(np.random.randint(60, 150, size=(6, 3)), columns=["Java", "C++", "PHP"],
                index=pd.MultiIndex.from_product([["张三", "李四", "王五"],
                                                  ["期中", "期末"]]))
print(df3)


# 对DataFrame列同样可以设置多层索引
df4 = DataFrame(np.random.randint(60, 150, size=(3, 6)),
                columns=pd.MultiIndex.from_product([["Java", "C++", "PHP"], ["期中", "期末"]]),
                index=["张三", "李四", "王五"])
print(df4)


'''练习:创建一个DataFrame,表示出张三李四期中期末各科成绩'''


'''3.多层索引对象的索引与切片操作
1)Series的操作【重要】
对于Series来说,直接中括号[]与使用.loc()完全一样。因此,推荐使用中括号索引和切片。'''
# (1)索引
# 第一个参数:多层索引的第一维,第二个参数:第二维
print(s["a", "期末"])
# ["a", "期末"]作为一个参数
print(s[["a", "期末"]])
print(s[["a", "b", "c"]])


# 切片
print(s["a": "b"])
# 将a的期中期末和b的期中进行显示
print(s.iloc[0:3])


'''
2)DataFrame的操作
'''
# (1)可以直接使用列名称来进行索引
df5 = DataFrame(np.random.randint(0, 150, size=(3, 3)),index=["张三", "李四", "王五"],
                columns=["Java", "PHP", "Python"])
print(df5)
# 对于二维的索引,如果包含中文,进行切片时可能会出现bug
print(df5["张三":"李四"])


# (2)使用行索引需要.ix(),loc()函数【极其重要】推荐使用loc()函数
# 注意:在对行进行索引的时候,若第一级索引还有多个,对二级行索引会遇到问题,也就是说,无法直接进行
# 对二级索引进行行索引,必须让二级索引变成一级索引后才能对其进行索引!
print(df3.loc["张三"].loc["期中"])
print(df3.loc["张三", "期中"])
print(df5.loc["张三"])


'''
4.索引的堆(stack)   (1) stack()     (2) unstack()
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
'''
print("\033[31;1m***************索引的堆*****************\033[0m")
print(df4)
# stack = 堆---->行
# 对于多次索引的列而言,0,1,2:从上往下计数
print(df4.stack(level=0))
print(df4.unstack())


'''
5.聚合操作【注意】需要指定axis
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留
'''
# 所谓的聚合操作:平均数、方差、最大值、最小值......
print("\033[34;1m***************聚合操作*****************\033[0m")
print(df3)

# axis=0 行,对行进行求和操作,行的数据就被加和到一起,列就显示了
print(df3.sum(axis=0))

# 计算方差
print(df3.std(axis=0))

# 计算最大值
print(df3.max())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章