ITPub博客

首页 > 数据库 > 数据库开发技术 > 对比excel,用python实现逆透视操作(宽表变长表)

对比excel,用python实现逆透视操作(宽表变长表)

原创 数据库开发技术 作者:可以叫我才哥 时间:2021-09-28 09:09:00 0 删除 编辑

大家好,我是才哥。

最近看到群友们在讨论一个宽表变长表的问题,其实这类需求也很常见于我们日常的数据处理中。综合群友们的智慧,今天我们就来看看excel与python如何实现这个需求吧!

如果你想加群,可以在文末添加作者好友,回复加群 拉你进群哈!

注:本文演示的数据大家可以在后台回复 955,在答疑解惑->逆透视 文件夹领取。

目录:

  • 1. excel逆透视技巧

  • 2. Pandas逆透视技巧


1. excel逆透视技巧

excel做逆透视操作是需要用到Power Query。

第一步:选中数据,然后在菜单栏-数据-点击来自表格/区域

第二步:创建表的时候,根据实际情况选中是否包含标题(本例不包含)

第三步:点击上述确认按钮后会出现Power Query编辑器

第四步:按照control,选中全部需要操作的列(或者shift连续取列),再到转换-点击逆透视列

第五步:可以看到出现了我们需要的结果

第六步:点击左上角文件,选中关闭并上载

第七步:我们发现,在原始表出现了 表1的页签,里面正是我们期望的逆透视结果,搞定!(删掉无关列属性即可)

excel的这个逆透视操作讲道理还是很方便的(感谢群成员 瓜瓜 的分享,关于excel更多操作,大家可以关注她的B站前往围观哦)

昵称:瓜宝宝在这里呀

地址:https://space.bilibili.com/341664311


2. Pandas逆透视技巧

我们知道分组透视操作是Pandas数据处理的一个非常重要的功能,自然也非常强大。在此前我们有过两篇文章应用到了分组透视功能,大家可以参考《Pandas学习笔记05-分组与透视》和《实践应用|pandas+PyQt5制作数据(分组)透视处理工具》。

不过,今天我们要做的是透视的逆向操作,也就是逆透视,pandas自然也提供了非常方便的函数方法,让我们来一起看看吧。

隆重推荐 melt函数方法:

df.melt(
    id_vars=None,
    value_vars=None,
    var_name=None,
    value_name='value',
    col_level: 'Level | None' = None,
    ignore_index: 'bool' = True,
) -> 'DataFrame'
Docstring:
Unpivot a DataFrame from wide to long format, optionally leaving identifiers set.

id_vars :tuple,list或ndarray(可选),用作标识变量的列

value_vars:tuple,列表或ndarray,可选,要取消透视的列。如果未指定,则使用未设置为id_vars的所有列

var_name:scalar,用于“变量”列的名称。如果为None,则使用frame.columns.name或“variable”

value_name:scalar,默认为“ value”,用于“ value”列的名称

col_level:int或str,可选,如果列是MultiIndex,则使用此级别来融化

就不举例了,直接拿案例数据开搞!

import pandas as pd
# 读取数据
df = pd.read_excel(r'0927测试数据.xlsx', header=None)
df
# 直接逆透视
(
    df.melt(id_vars=df.columns[:2], # 标识变量的列
        value_vars=df.columns[2:], # 注释掉结果一样
        ignore_index=True, # 忽略索引
           )
    .sort_values(by=[0,1]) # 排序
    .dropna() # 删除含空值的行
)

是不是很方便,直接一个函数即可搞定,感谢 群成员 1px 提供的思路。

这种解决方案,笔者在之前给朋友处理过,不过看到这题的时候我居然用的是另外一种更复杂的解决方法,简直秀逗了。

我们也看看这种更麻烦的解决方案吧:

核心是explode爆炸列

data = df.iloc[:,:2].copy()
data
# 辅助列用于存储店信息列表
data['辅助列'] = list(df.loc[:,2:].values)
data
# 爆炸列完成需求
data.explode(column='辅助列').dropna()

以上就是本次的全部内容,围绕着关于宽表转长表,也就是逆透视的操作。其实excel和pandas都提供了很简单直接的处理方法,大家熟悉操作后自然就能轻车熟路,高效解决问题啦。

不过,我们也可以通过其他一些思路来锻炼自己的逻辑思维能力,也许能更强化自己对复杂问题的应对水平哦!

温馨再提示:本文演示的数据大家可以在后台回复 955,在答疑解惑->逆透视 文件夹领取。

喜欢的话,记得点个赞+在看走起~~




推荐阅读


对比excel,用python获取时序数据中的日期与时间(分列)

2021-09-27

对比Excel,用Pandas轻松搞定IF函数操作

2021-08-30

对比Excel,一文掌握Pandas表格条件格式(可视化)

2021-08-07

文末推荐一本书

来自数据分析师可乐妹子的力作哦

原文作者:可以叫我才哥;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-03-18

  • 博文量
    161
  • 访问量
    69018