永洪社区

标题: Python如何将横表和纵表任意转换?两种方法告诉你 [打印本页]

作者: 喝酸奶不舔盖    时间: 2024-7-2 11:26
标题: Python如何将横表和纵表任意转换?两种方法告诉你
本帖最后由 喝酸奶不舔盖 于 2024-7-2 11:28 编辑

我们日常做数据分析,接收到最多的表格是纵表,每个字段变量都有很长数据的长表,我们称之为纵向数据,但是,有时候,我们也会遇到横表,称之为横向数据,对于横向数据,我们会数据转化,将其转化为纵向数据进行数据处理,下面一起来学习。
示例工具:anconda3.7
本文讲解内容:pandas数据重塑
适用范围:在Python横表与纵表转化


首先导入我们本次案例使用的横向数据,从这里看出,横向数据类似于Excel数据透视表得出的表,将''季度''这个字段拖入到列,就会得到横表。

导入横向数据如下,包含城市、年份等字段。
import pandas as pd  wide_table=pd.read_excel(r'C:\Users\尚天强\Desktop\各城市销量横向数据.xlsx') wide_table

横表转纵表
横表转纵表这里介绍两种方法,一种是melt()方法,另一种是stack()方法,在melt()的参数中id_vars表示不需要被转换的列名,除此之外剩下的列全部都要转换,就不用写了,var_name和value_name是自定义设置对应的列名,转为长表的数据如下所示。
long_table=wide_table.melt(id_vars=["城市","年份"],var_name="季度",value_name="销售量") long_table=long_table.sort_values(by=["城市","年份","销售量"],ascending=False) long_table

使用stack()方法,首先将'城市','年份'设置为这组数据的索引,然后stack()将列索引转换为行索引,最后reset_index()重置索引,修改一下列名,即可的得到与上面一样的结果。
long_table=wide_table.set_index(['城市','年份']).stack().reset_index() long_table.columns=['城市','年份','季度','销售量'] long_table

纵表转横表
纵表转横表就是使用前面介绍的数据透视的方法,看看Python如何做数据透视,这里使用pivot_table(),与Excel数据透视表类似,index放入行值,columns放入列值,values放入计算的值,然后重置索引,即可得到横表的结果。
wide_table=long_table.pivot_table(index=['城市','年份'],columns='季度',values='销售量').reset_index() wide_table=wide_table[['城市','年份','第一季度','第二季度','第三季度','第四季度']] wide_table

除此之外介绍一个SQL语法创建数据透视表的方法,这里导入pandasql库,sum结合case when函数判断计算列值,然后group by进行分组,即可得出如下的结果。
import pandasql as sql  sql.sqldf("""select 城市,年份,              sum(case when 季度="第一季度" then 销售量 end) as "第一季度",              sum(case when 季度="第二季度" then 销售量 end) as "第二季度",              sum(case when 季度="第三季度" then 销售量 end) as "第三季度",              sum(case when 季度="第四季度" then 销售量 end) as "第四季度"               from long_table              group by 城市,年份              order by 年份;""")

数据导出
本节的内容相对比较简单,熟练掌握纵表和横表的相互转化方法,以及数据透视的方法,可以让数据清洗变得尤为简单,数据表转换后赋值变量,然后导出,数据结果如下所示。
table1=long_table table2=sql.sqldf("""select 城市,年份,                     sum(case when 季度="第一季度" then 销售量 end) as "第一季度",                     sum(case when 季度="第二季度" then 销售量 end) as "第二季度",                     sum(case when 季度="第三季度" then 销售量 end) as "第三季度",                     sum(case when 季度="第四季度" then 销售量 end) as "第四季度"                     from long_table                     group by 城市,年份                     order by 年份;""")#数据导出 write=pd.ExcelWriter(r'C:\Users\尚天强\Desktop'+'\\Python转置结果'+'.xlsx')table1.to_excel(write,sheet_name='Python横向转纵向',index=False) table2.to_excel(write,sheet_name='Python纵向转横向',index=False)write.save()write.close()



文章源自:大话数据分析






欢迎光临 永洪社区 (https://club.yonghongtech.com/) Powered by Discuz! X3.4