看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
多层索引和单层索引一样,但在它也有一些特定的操作,我们在操作多层索引时需要熟练掌握,以后更加灵活地运用。
index_arrays = [[1, 1, 2, 2], ['男', '女', '男', '女']]
columns_arrays = [['2020', '2020', '2021', '2021'],
['上半年', '下半年', '上半年', '下半年',]]
index = pd.MultiIndex.from_arrays(index_arrays,
names=('班级', '性别'))
columns = pd.MultiIndex.from_arrays(columns_arrays,
names=('年份', '学期'))
df = pd.DataFrame([(88,99,88,99),(77,88,97,98),
(67,89,54,78),(34,67,89,54)],
columns=columns, index=index)
'''
年份 2020 2021
学期 上半年 下半年 上半年 下半年
班级 性别
1 男 88 99 88 99
女 77 88 97 98
2 男 67 89 54 78
女 34 67 89 54
'''
索引名称的查看:
df.index # 索引, 是一个 MultiIndex
df.columns # 引索引,也是一个 MultiIndex
# 查看行索引的名称
df.index.names # FrozenList(['班级', '性别'])
# 查看列索引的名称
df.columns.names # FrozenList(['年份', '学期'])
索引的层级:
df.index.nlevels # 层级数
df.index.levels # 行的层级
# FrozenList([[1, 2], ['女', '男']])
df.columns.levels # 列的层级
# FrozenList([['2020', '2021'], ['上半年', '下半年']])
df[['2020','2021']].index.levels # 筛选后的层级
索引内容的查看:
# 获取索引第2层内容
df.index.get_level_values(1)
# Index(['男', '女', '男', '女'], dtype='object', name='性别')
# 获取列索引第1层内容
df.columns.get_level_values(0)
# Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份')
# 按索引名称取索引内容
df.index.get_level_values('班级')
# Int64Index([1, 1, 2, 2], dtype='int64', name='班级')
df.columns.get_level_values('年份')
# Index(['2020', '2020', '2021', '2021'], dtype='object', name='年份')
# 多层索引的数据类型,1.3.0+
df.index.dtypes
# 使用索引名可进行排序,可以指定具体的列
df.sort_values(by=['性别', ('2020','下半年')])
df.index.reorder_levels([1,0]) # 等级顺序,互换
idx.set_codes([1, 1, 0, 0], level='foo') # 设置顺序
df.index.sortlevel(level=0, ascending=True) # 按指定级别排序
df.index.reindex(df.index[::-1]) # 更换顺序,或者指定一个顺序
df.index.to_numpy() # 生成一个笛卡尔积的元组对列表
# array([(1, '男'), (1, '女'), (2, '男'), (2, '女')], dtype=object)
df.index.remove_unused_levels() # 返回没有使用的层级
df.swaplevel(0, 2) # 交换索引
df.to_frame() # 转为 DataFrame
idx.set_levels(['a', 'b'], level='bar') # 设置新的索引内容
idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1])
idx.to_flat_index() # 转为元组对列表
df.index.droplevel(0) # 删除指定等级
df.index.get_locs((2, '女')) # 返回索引的位置
应用函数:
df.columns.map(len)
df.index.map(len)
多层索引 修改某一层的数据类型方法:
# 修改某一层的数据类型
df.index = df.index.set_levels([*df.index.levels[0].astype(str)], level=0)
# 全部修改
a = df.index.get_level_values(0).astype(float)
b = df.index.get_level_values(1).astype(float)
df.index = [a,b]
df.set_index([a,b]) # 同上
df.set_index(df.index.set_levels([a,b]))
更新时间:2023-06-16 09:05:50 标签:pandas 索引