Pandas 多层索引转化为列

处理原因

当DataFrame使用分组聚合后,分组的规则会作为索引,如下例。为了便于后续对表格数据的处理和分析,可将索引转化为列。

数据样式

# 各地区分店每年的销售额
sales_area = df.groupby(['Market','Order_Year'])['Sales'].sum()
# 当前sales_area有多层索引
sales_area

使用reset_index()函数将索引转换为列

reset_index()函数

pandas.DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数:
level:int,str,tuple,or list,default None
仅从索引中删除输入的级别,默认删除全部索引
drop:bool,default False
不会将删除的索引转化成列,默认是False:转化成列;True:删除的索引直接丢弃,不转化成列
inplace:bool,defualt False
是否在原数据上做更改,默认False:不在源数据上做更改,此时有返回值DataFrame需要变量进行赋值;True无返回值
col_level
col_fill
返回值:DataFrame或None(取决于参数inplace的值)

pandas.Series.reset_index(level=None, drop=False, name=None, inplace=False)
参数:
level
drop
name:object,str
对原数据列的列名字进行更改,当drop为False才能使用本参数
inplace
当drop为False时,返回DataFrame类型,由于原数据类型是Series,返回值类型和原数据类型不同,故不能在原数据上更改,inplace只能是False;当drop为True时,返回series类型,此时inplace=True可在原数据上更改
返回值:Series or DataFrame or None(取决于参数drop和inpalce的值)

错误示例

# 各地区分店每年的销售额
sales_area = df.groupby(['Market','Order_Year'])['Sales'].sum()
# 将索引转化为列
sales_area.reset_index(inplace=True)
sales_area

报错:TypeError: Cannot reset_index inplace on a Series to create a DataFrame

正确转化

由于返回值是DataFrame类型,原数据是Series类型,故此时不能在原数据上更改。修改如下:

# 各地区分店每年的销售额
sales_area = df.groupby(['Market','Order_Year'])['Sales'].sum()
# 将索引转化为列
sales_area=sales_area.reset_index()
sales_area

原文地址:https://www.cnblogs.com/Wendy-r/p/14965489.html