欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【应用】【python】快速有效修改groupby后的列名

时间:2023-05-15

     我们在使用pandas的groupby方法做统计分析时,发现聚合后的列名是MultiIndex类型。此时,必须通过元组的复合索引方式,才能有效提取列的信息。

下面,将以一个具体的实例,来说明如何快速、有效的修改MultiIndex格式的列名。


首先,创建一个Dataframe类型的数据data:

import pandas as pd# 首先构造一个Dataframedata = pd.Dataframe([["小明", "英语", "80"], ["小明", "数学", "70"], ["小明", "语文", "81"], ["小红", "英语", "80"], ["小红", "英语", "95"]], columns=["name", "subject", "score"])print(data)print(data.columns)

此时,打印data的列名,是Index格式。并且,可以直接通过rename方法重命名columns,这里就不作演示。

name subject score0 小明 英语 801 小明 数学 702 小明 语文 813 小红 英语 804 小红 英语 95Index(['name', 'subject', 'score'], dtype='object')

如果使用groupby方法,对每个人的学科得分做一个求和(sum)和平均(mean):

import pandas as pd# 首先构造一个Dataframedata = pd.Dataframe([["小明", "英语", "80"], ["小明", "数学", "70"], ["小明", "语文", "81"], ["小红", "英语", "80"], ["小红", "英语", "95"]], columns=["name", "subject", "score"])# 对data做统计:求和、均值data_groupby = data.groupby(["name", "subject"]).agg({"score": ["sum", "mean"]})print(data_groupby)print("n")print(data_groupby.columns)

此时,data_groupby的columns类型,变成MultiIndex。

score sum meanname subject 小明 数学 70 70.0 英语 80 80.0 语文 81 81.0小红 英语 8095 4047.5MultiIndex([('score', 'sum'), ('score', 'mean')], )

如果使用rename方法,对列名重命名,发现并不起作用。

import pandas as pd# 首先构造一个Dataframedata = pd.Dataframe([["小明", "英语", "80"], ["小明", "数学", "70"], ["小明", "语文", "81"], ["小红", "英语", "80"], ["小红", "英语", "95"]], columns=["name", "subject", "score"])# 对data做统计:求和、均值data_groupby = data.groupby(["name", "subject"]).agg({"score": ["sum", "mean"]})# 重命名列名:不起作用data_groupby.rename({("score", "sum"): "score_sum", ("score", "mean"): "score_mean"}, inplace=True)print(data_groupby.columns)MultiIndex([('score', 'sum'), ('score', 'mean')], )

所以,我们通过遍历columns的方式,将MultiIndex的一级和二级索引拼接在一起,作为data的新列名。

import pandas as pd# 首先构造一个Dataframedata = pd.Dataframe([["小明", "英语", "80"], ["小明", "数学", "70"], ["小明", "语文", "81"], ["小红", "英语", "80"], ["小红", "英语", "95"]], columns=["name", "subject", "score"])# 对data做统计:求和、均值data_groupby = data.groupby(["name", "subject"]).agg({"score": ["sum", "mean"]})# 重命名列名:不起作用# data_groupby.rename({("score", "sum"): "score_sum", ("score", "mean"): "score_mean"}, inplace=True)# 重命名列名data_groupby.columns = [i[0] + "_" + i[1] for i in data_groupby.columns]print(data_groupby.columns)Index(['score_sum', 'score_mean'], dtype='object')

这样的话,完美变为我们想要的列名。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。