全文共1258字,预计学习时长8分钟
如何将数据集从行式变为列式?有很多种方法可以做到这一点,但pandas的melt()方法是其中最灵活的一种,你只需要学好这种就足够了。
本文将传授给你数据集的“乾坤大挪移”大法,使用pd.melt()或melt方法使pandas. dataframe发生形变。一起来看看吧!
行式vs宽式数据集
如果我们将一个行式数据集与列式数据集进行比较,最容易理解行式数据集是什么样?
下面是相应的数据集,但是是用长表单的形式:
在开始pd.melt教程之前,先使用pd.DataFrame在Python中重新创建上面的行式数据集。
import pandas as pd# createwide dataframedf_wide = pd.DataFrame( {"student": ["Andy","Bernie", "Cindy", "Deb"], "school": ["Z", "Y", "Z","Y"], "english": [10, 100, 1000,10000], # eng grades "math": [20, 200, 2000, 20000], # math grades "physics": [30, 300, 3000,30000] # physics grades })
形变1
通过id_vars指定标识符列来使数据集发生形变。“剩余的”非标识符列(英语,数学,物理学)将形变或彼此堆叠成一列。
我们要创建一个新的指标列(包含值英语,数学,物理),可以通过var_name重命名该新列(cLaSs),还可以通过value_name重命名包含所有实际成绩的列(gRaDe)。
print(df_wide)> student school english math physics Andy Z 10 20 30 Bernie Y 100 200 300 Cindy Z 1000 2000 3000 Deb Y 10000 20000 30000df_wide.melt(id_vars=["student","school"], var_name="cLaSs", #rename value_name="gRaDe") # rename> student school cLaSs gRaDe0 Andy Z english 101 Bernie Y english 1002 Cindy Z english 10003 Deb Y english 100004 Andy Z math 205 Bernie Y math 2006 Cindy Z math 20007 Deb Y math 200008 Andy Z physics 309 Bernie Y physics 30010 Cindy Z physics 300011 Deb Y physics 30000
形变2
可以使用value_vars指定要形变或堆叠到列中的列(此处不包括物理列,因此value_vars = [“ english”,“ math”]),还将从id_vars中删除“school”列。
print(df_wide)> student school english math physics Andy Z 10 20 30 Bernie Y 100 200 300 Cindy Z 1000 2000 3000 Deb Y 10000 20000 30000df_wide.melt(id_vars="student", value_vars=["english", "math"], var_name="cLaSs", # rename value_name="gRaDe") #rename> student cLaSs gRaDe0 Andy english 101 Bernie english 1002 Cindy english 10003 Deb english 100004 Andy math 205 Bernie math 2006 Cindy math 20007 Deb math 2000
形变3
最后,来看看如果仅将学生列指定为标识符列(id_vars =“ student”),但未指定要通过value_vars堆叠的列会发生什么情况。结果是,所有非标识符列(学校,英语,数学,物理)将被堆叠到一列中。
最终的列式数据集看起来是错误的,cLaSs和gRaDe列包含了不应包含的值。不过,这里的重点是展示pd.melt的工作方式:
print(df_wide)> student school english math physics Andy Z 10 20 30 Bernie Y 100 200 300 Cindy Z 1000 2000 3000 Deb Y 10000 20000 30000df_wide.melt(id_vars="student", var_name="cLaSs", #rename value_name="gRaDe") #rename> student cLaSs gRaDe0 Andy school Z1 Bernie school Y2 Cindy school Z3 Deb school Y4 Andy english 105 Bernie english 1006 Cindy english 10007 Deb english 100008 Andy math 209 Bernie math 20010 Cindy math 200011 Deb math 2000012 Andy physics 3013 Bernie physics 30014 Cindy physics 300015 Deb physics 30000
学好这一招,所有数据集形变都不怕。记得要自己操作一遍哟!
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范