pandas中DataFrame多层索引的实现
1、创建
相较于一层索引,在创建多层索引时给字段添加关系,其创建方法包括运用元组、数组、笛卡尔积,在普通DataFrame中创立。
1.1方式一使用pd.MultiIndex.from_tuples创建索引
tuples为元组 含义就是使用pandas中用元组建立多层索引
import pandas as pd import numpy as np #这里创建的两层索引,姓名、考试 index_lables=[('张三','期中'),('张三','期末'),('李四','期中'),('李四','期末')] mult_index = pd.MultiIndex.from_tuples(index_lables,names=('name','exam')) data = { 'python':[98,149,130,147], 'math':[95,78,143,104] } df=pd.DataFrame(data,index=mult_index)
1.2方式二:使用pd.MultiIndex.from_arrays(数组)
index_labels = [['张三','张三','李四','李四'],['期中','期末','期中','期末']] mult_index=pd.MultiIndex.from_arrays(index_labels,names=('name','exam')) df=pd.DataFrame(data,index=mult_index)
1.3方式三:使用pd.MultiIndex.from_product(笛卡尔积)
index_lables=pd.MultiIndex.from_product([['张三','李四','王五','赵六'], ['期中','期末']], names=['name','exam']) df=pd.DataFrame(np.random.randint(80,150, size=(8,2)), index=index_lables, columns=['python','math'] ) df1=pd.DataFrame(np.random.randint(80,150,size=(2,4)), index=['张三','李四'], columns=pd.MultiIndex.from_product([['python','math'],['期中','期末']]))
笛卡尔积使用的不同其创建的dataframe也不同
df1
df
1.4方式四在已有的DataFrame基础上创建
使用set_index方法进行创建
参数:
keys,要设置为索引的列名(如有多个应放在一个列表里)
drop: bool = True,将设置为索引的列删除,默认为True
append: bool = False,是否将新的索引追加到原索引后(即是否保留原索引),默认为False
inplace: bool = False, 是否在原DataFrame上修改,默认为False
verify_integrity: bool = False,是否检查索引有无重复,默认为False
示例:
import pandas as pd import numpy as np data={ 'year':[2020,2020,2021,2021,2022,2022], 'quarter':[1,2,1,2,1,2], 'sales':[100,150,120,130,140,180], 'profit':[50,80,80,100,30,80] } df=pd.DataFrame(data) print(df) df.set_index(['year','quarter'],inplace=True) print(df)
2、筛选数据
多层索引的DataFrame的index(每一行的下标)为元组
print(df.index)
在筛选数据时,与普通的DataFrame一致,可以通过标签、位置、字段名、切片进行筛选
根据标签索引
print(df.loc[[2020,2021]]) print(df.loc[(2020,1)])#与df.loc[2020].loc[1]一致 print(df.loc[[(2020,1),(2020,2)]]) print(df.loc[(2020,1):(2021,2)])
根据位置索引
print(df.iloc[[0,1]]) print(df.iloc[0:4,[0]])#如果‘,'的0不加[],则该列为series
3、分层计算
之前DataFrame的统计函数有level参数,能够给多层索引DataFrame运用,但已被舍弃,现在想要运算需要使用:DataFrame.groupby(level=层数).函数名()
我们以例子进行说明:(这个输出的DataFrame有点丑,别介意)
import pandas as pd import numpy as np df=pd.DataFrame(np.random.randint(0,151,size=(40,3)), index=pd.MultiIndex.from_product([ list('ABCDEFGHIJ'),['期中','期末'],['平时成绩','考试成绩']]), columns=['math','python','english'] ) print(df)
我们先来看层级,最左边的标签为字母,然后是“期中/期末”,最后是成绩类别,所以对应的层数为0,1,2。弄清楚之后,我们使用代码看看运算结果。
print(df.groupby(level=0).mean()) print(df.groupby(level=1).mean()) print(df.groupby(level=2).mean())
level=1
level=2|level=3
可以看出,level=0时,根据每个同学的其他4项计算各科平均分,level=1时,计算期中期末的平均分。
到此这篇关于pandas中DataFrame多层索引的实现 的文章就介绍到这了,更多相关pandas DataFrame多层索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Pytorch中torch.utils.checkpoint()及用法详解
在PyTorch中,torch.utils.checkpoint 模块提供了实现梯度检查点(也称为checkpointing)的功能,这篇文章给大家介绍了Pytorch中torch.utils.checkpoint()的相关知识,感兴趣的朋友一起看看吧2024-03-03
最新评论