Python小案例(二)长宽表转换

Python小案例(二)长宽表转换

在日常与运营、产品打交道时,你会发现他们提供给数分的Excel大多数是宽表,而数分提供给业务的多是长表。因此进行长宽表转换就显得很有必要性了。

import pandas as pd

长表转宽表

# 构造长表数据
df_len = pd.DataFrame(
    {'阶段':['小学','小学','小学','小学','小学','小学','小学','小学','小学','初中','初中','初中','初中','初中','初中'],
        '科目':['英语','英语','英语','语文','语文','语文','数学','数学','数学','数学','数学','数学','语文','语文','语文'],
        '基础':[10,10,10,2,2,2,8,8,8,5,5,5,6,6,6],
        '等级':['一级','二级','三级','一级','二级','三级','一级','二级','三级','一级','二级','三级','一级','二级','三级'],
         '加成':[3.2,1.7,3.1,3.6,2.8,4,2.2,2.1,1.7,1.2,2,2.4,2.7,1.3,1.9]})

df_len.head()
阶段 科目 基础 等级 加成
0 小学 英语 10 一级 3.2
1 小学 英语 10 二级 1.7
2 小学 英语 10 三级 3.1
3 小学 语文 2 一级 3.6
4 小学 语文 2 二级 2.8

groupby方式

result = df_len.groupby(['阶段', '科目', '基础', '等级'])['加成'].max().unstack(3).dropna(axis=0, 
                        how='any').reset_index().rename_axis([None], axis=1)
order = ['阶段', '科目', '基础', '一级', '二级', '三级']
result[order].to_excel('wide_table.xlsx', index=None)

# 转换后结果
result[order]
阶段 科目 基础 一级 二级 三级
0 初中 数学 5 1.2 2.0 2.4
1 初中 语文 6 2.7 1.3 1.9
2 小学 数学 8 2.2 2.1 1.7
3 小学 英语 10 3.2 1.7 3.1
4 小学 语文 2 3.6 2.8 4.0

pivot_table方式

result = df_len.pivot_table(index=['阶段', '科目', '基础'],
                  columns=['等级'],
                  values=['加成']).reset_index()

result = result.set_index(['阶段', '科目', '基础'])
result.columns = result.columns.droplevel(0)
result = result.reset_index().rename_axis([None], axis=1)
order = ['阶段', '科目', '基础', '一级', '二级', '三级']
result[order].to_excel('wide_table.xlsx', index=None)

# 转换后结果
result[order]
阶段 科目 基础 一级 二级 三级
0 初中 数学 5 1.2 2.0 2.4
1 初中 语文 6 2.7 1.3 1.9
2 小学 数学 8 2.2 2.1 1.7
3 小学 英语 10 3.2 1.7 3.1
4 小学 语文 2 3.6 2.8 4.0

宽表转长表

df_wide = pd.read_excel('wide_table.xlsx', index_col=[0,1,2]) # 将维度转为索引,即阶段、科目、基础

# 转换前示例
df_wide.head()
一级 二级 三级
阶段 科目 基础
初中 数学 5 1.2 2.0 2.4
语文 6 2.7 1.3 1.9
小学 数学 8 2.2 2.1 1.7
英语 10 3.2 1.7 3.1
语文 2 3.6 2.8 4.0
result = pd.DataFrame(df_wide.stack()).reset_index()
result.columns = ['阶段', '科目', '基础', '等级', '加成']

# 转换后结果
result.head()
阶段 科目 基础 等级 加成
0 初中 数学 5 一级 1.2
1 初中 数学 5 二级 2.0
2 初中 数学 5 三级 2.4
3 初中 语文 6 一级 2.7
4 初中 语文 6 二级 1.3

共勉~

#数据分析教程##数据分析师工作#
数据分析实用手册 文章被收录于专栏

微信知乎搜索HsuHeinrich,第一时间更新~ 最真实的数据分析教程,SQL、Python、Tableau、Excel、数据基建、BI报表、埋点、专题分析、数据挖掘、A/B试验。日常分析师涉及的方方面面,这里都有~

全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务