dataframe删除一列_数据集的“乾坤大挪移”:如何使pandas.Dataframe从行式到列式?

全文共1258字,预计学习时长8分钟

b3a89a8bde82631d91d8dde2dd62d47b.png

图源:unsplash

如何将数据集从行式变为列式?有很多种方法可以做到这一点,但pandas的melt()方法是其中最灵活的一种,你只需要学好这种就足够了。

本文将传授给你数据集的“乾坤大挪移”大法,使用pd.melt()或melt方法使pandas. dataframe发生形变。一起来看看吧!

3fb875235097c17e7c07a04319d4d45a.png
5e868f75c5fb08757112a13090053165.png

行式vs宽式数据集

如果我们将一个行式数据集与列式数据集进行比较,最容易理解行式数据集是什么样?

08b015c2033ae550926e2291584f9032.png

pd.melt可以使Pandas.dataframe()进行形变/堆叠

下面是相应的数据集,但是是用长表单的形式:

0a61e0ce72b5baf19302e25faeae887f.png

pd.pivot_table()可以使长pandas.dtatframe不发生形变

在开始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 })
5e868f75c5fb08757112a13090053165.png

形变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
b254893560fd5b58041c134c3fe8e38c.png

行式到列式:新的指标列“cLaSs”+形变/堆叠的“gRaDe”列的值

5e868f75c5fb08757112a13090053165.png

形变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
e2a5ad11345e5f2f040894dbb625b29c.png

行式到列式:原始专栏学校和物理课程已被删除

5e868f75c5fb08757112a13090053165.png

形变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
81afef9ae6611bbfd8fe0f7b7994fd21.png

行式到列式:学校列不是标识符列

学好这一招,所有数据集形变都不怕。记得要自己操作一遍哟!

1fe2c819e7c17bf97d0f1f9f272545a6.png

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值