Pandas数据分析-pandas数据框的多层索引

 更新时间:2022年08月12日 10:36:11   作者:阡之尘埃  
这篇文章主要介绍了Pandas数据分析-pandas数据框的多层索引,pandas数据框针对高维数据,也有多层索引的办法去应对具体详细的内容介绍需要的小伙伴可以参考一下

前言

pandas数据框针对高维数据,也有多层索引的办法去应对。多层数据一般长这个样子

可以看到AB两大列,下面又有xy两小列。 行有abc三行,又分为onetwo两小行。

在分组聚合的时候也会产生多层索引,下面演示一下。

导入包和数据:

import numpy as np 
import pandas as pd
df=pd.read_excel('team.xlsx')

分组聚合:

df.groupby(['team',df.mean(1)>60]).count() #每组平均分大于60的人的个数

 可以看到分为abcde五组,平均分大于60 的组员两小行。

创建多层索引

#序列中创建
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
index=pd.MultiIndex.from_arrays(arrays, names=('number', 'color'))
index

pd.DataFrame([{'a':1, 'b':2}], index=index)

#来自元组创建
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
pd.Series(np.random.randn(8), index=index)

#可迭代对象的笛卡尔积,排列组合各种情况
numbers = [0, 1, 2]
colors = ['green', 'purple']
index = pd.MultiIndex.from_product([numbers, colors],names=['number', 'color'])
pd.Series(np.random.randn(6), index=index)

#来自 DataFrame
df = pd.DataFrame([['bar', 'one'], ['bar', 'two'],
                   ['foo', 'one'], ['foo', 'two']],
                  columns=['first', 'second'])
'''
  first second
0   bar    one
1   bar    two
2   foo    one
3   foo    two
'''
index = pd.MultiIndex.from_frame(df)
pd.Series(np.random.randn(4), index=index)

 多层索引操作

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)
df

 索引名称的查看

#索引名称的查看:
df.index # 索引, 是一个 MultiIndex
df.columns # 引索引,也是一个 MultiIndex
# 查看行索引的名称
df.index.names # FrozenList(['班级', '性别'])
# 查看列索引的名称
df.columns.names # FrozenList(['年份', '学期'])

 索引的层级

#索引的层级:
df.index.nlevels # 层级数   2
df.index.levels # 行的层级    # FrozenList([[1, 2], ['女', '男']])
df.columns.levels # 列的层级  # FrozenList([['2020', '2021'], ['上半年', '下半年']])
df[['2020','2021']].index.levels # 筛选后的层级  # FrozenList([[1, 2], ['女', '男']])

 索引内容的查看

#索引内容的查看:
# 获取索引第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])  # 等级顺序,互换
df.index.set_codes([1, 1, 0, 0], level='班级') # 设置顺序
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.loc[1] #一班的
df.loc[(1, '男')] # 一年级男
df.loc[1:2] # 一二两年级数据

#查询指定列
df['2020'] # 整个一级索引下
df[('2020','上半年')] # 指定二级索引
df['2020']['上半年'] # 同上

#行列综合  slice(None)表示本层所有内容
df.loc[(1, '男'), '2020'] # 只显示2020年一年级男
df.loc[:, (slice(None), '下半年')] # 只看下半年的
df.loc[(slice(None), '女'),:] # 只看女生
df.loc[1, (slice(None)),:] # 只看1班
df.loc[:, ('2020', slice(None))] # 只看 2020 年的

#查询指定条件

#和单层索引的数据查询一样,不过在选择列上要按多层的规则。
df[df[('2020','上半年')] > 80]

#pd.IndexSlice切片使用:
 
idx = pd.IndexSlice
idx[0]               # 0
idx[:]               # slice(None, None, None)
idx[0,'x']           # (0, 'x')
idx[0:3]             # slice(0, 3, None)
idx[0.1:1.5]         # slice(0.1, 1.5, None)
idx[0:5,'x':'y']     # (slice(0, 5, None), slice('x', 'y', None))
#查询应用:
idx = pd.IndexSlice
df.loc[idx[:,['男']],:] # 只显示男
df.loc[:,idx[:,['上半年']]] # 只显示上半年
 
#df.xs()
df.xs((1, '男')) # 一年级男生
df.xs('2020', axis=1) # 2020 年
df.xs('男', level=1) # 所有男生

 数据分组

df.groupby(level=0).sum()
df.groupby(level='性别').sum()
df.sum(level='班级') # 也可以直接统计

df.groupby(level=['性别', '班级']).sum()

到此这篇关于Pandas数据分析-andas数据框的多层索引的文章就介绍到这了,更多相关pandas多层索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python运用pygame库实现双人弹球小游戏

    python运用pygame库实现双人弹球小游戏

    这篇文章主要为大家详细介绍了python运用pygame库实现双人弹球小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • python中wx将图标显示在右下角的脚本代码

    python中wx将图标显示在右下角的脚本代码

    python中wx将图标显示在右下脚的代码,此程序摘自wxdemo,不够完善,只供参考用
    2013-03-03
  • 解决import tensorflow as tf 出错的原因

    解决import tensorflow as tf 出错的原因

    这篇文章主要介绍了解决import tensorflow as tf 出错的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python使用multiprocessing如何实现多进程

    Python使用multiprocessing如何实现多进程

    这篇文章主要介绍了Python使用multiprocessing如何实现多进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Pytorch 使用不同版本的cuda的方法步骤

    Pytorch 使用不同版本的cuda的方法步骤

    这篇文章主要介绍了Pytorch 使用不同版本的cuda的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python 多继承中的一个诡异现象 既是 Father又是grandfather

    Python 多继承中的一个诡异现象 既是 Father又是grandfather

    我们知道,在面向对象编程里面,继承是一个很重要的概念。子类可以使用父类的方法和属性,接下来小编将用举例的方式为大家讲解Python 多继承中的一个诡异现象 其即是爸爸又是爷爷的奇葩现象,感兴趣的小伙伴可以看下面文章具体了解
    2021-09-09
  • python批量处理打开多个文件

    python批量处理打开多个文件

    这篇文章主要介绍了python批量处理打开多个文件,文章围绕主题的相关内容展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • 在python tkinter中Canvas实现进度条显示的方法

    在python tkinter中Canvas实现进度条显示的方法

    今天小编就为大家分享一篇在python tkinter中Canvas实现进度条显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 解决Python数据可视化中文部分显示方块问题

    解决Python数据可视化中文部分显示方块问题

    这篇文章主要介绍了解决Python数据可视化中文部分显示方块问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • numpy.meshgrid()理解(小结)

    numpy.meshgrid()理解(小结)

    这篇文章主要介绍了numpy.meshgrid()理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论