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())
全部评论

相关推荐

饥饿的长颈鹿就要上岸...:简历五项结构 简历只放五项内容,顺序和格式如下: 一、个人信息 只写名字、电话、邮箱 不写性别、年龄、籍贯、政治面貌、微信等额外信息 二、教育经历 格式:学校名称 | 学历 | 专业 | 就读时间 从左到右排列,一行写完 如果专业和岗位对口,写1-2行主修课程;不对口就不写 学历如果不占优势,可以把教育经历放到简历靠后的位置 三、实习/项目经历 如果没有实习经历,全部写项目经历 每条经历格式:项目名 + 岗位名 + 任职时间段 下面写三到五条工作内容 每条工作内容开头必须用四个字概括,加粗,后面跟一条完整描述 所有描述必须用STAR法则来写(情境-任务-行动-结果) 每一条都要有数据支撑和具体成果 四、个人优势 可以写获得的奖项、证书 如果奖项不够,就写你熟练掌握的技能 每条也要有具体数据或成果支撑,不能空泛堆砌 五、整体要求 一页纸,不要超过一页 个人信息只写名字加电话邮箱 贝贝试一下这个方式写简历,我虽然没收到offer,至少收到了好几轮面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务