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

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

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


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

import pandas as pd

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

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

  name subject score
0   小明      英语    80
1   小明      数学    70
2   小明      语文    81
3   小红      英语    80
4   小红      英语    95
Index(['name', 'subject', 'score'], dtype='object')

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

import pandas as pd

# 首先构造一个DataFrame
data = 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    mean
name subject              
小明   数学         70    70.0
     英语         80    80.0
     语文         81    81.0
小红   英语       8095  4047.5


MultiIndex([('score',  'sum'),
            ('score', 'mean')],
           )

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

import pandas as pd

# 首先构造一个DataFrame
data = 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

# 首先构造一个DataFrame
data = 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')

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

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八号线土著

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值