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初中数学51.22.02.4
1初中语文62.71.31.9
2小学数学82.22.11.7
3小学英语103.21.73.1
4小学语文23.62.84.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初中数学51.22.02.4
1初中语文62.71.31.9
2小学数学82.22.11.7
3小学英语103.21.73.1
4小学语文23.62.84.0

宽表转长表

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

# 转换前示例
df_wide.head()
一级二级三级
阶段科目基础
初中数学51.22.02.4
语文62.71.31.9
小学数学82.22.11.7
英语103.21.73.1
语文23.62.84.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

共勉~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值