dataframe两个表合并_Pandas数据变换-长宽表互换

b30b4a5db03bd88ce9be1497620342f1.png
最近工作中,有时会遇到数据转化的问题,这块知识之前掌握得比较零散,今天花时间整理了下

数据来源于下

jizhang/pandas-tidy-data​github.com
f780b021025c6a6051c8774c0db5fead.png

一.层级索引

层级索引可以作为增加维度的方法,也是行列转换的关键,Pandas原有的数据类型包括Series,DataFrame

Series可以看成是一维数组+索引

DataFrame可以看成是多个Series组成的二维数组

那么如果用实现比二维更高的数据,就可以使用层次索引

例如,如果我们想用Series实现二维数据,可以增加一层索引

In

如果将元组作为键的字典传递给 Pandas,Pandas 也会默认转换为 MultiIndex,这也是创建层级索引的方式之一。

我们来看下index的两个重要属性:levels和names

以上述层级索引为例:

data

可以看出levels属性包含各等级索引的索引值,是个二维列表。例如其中['California', 'New York', 'Texas']就是一级索引levels[0]。

data.index.names

#FrozenList([None, None])

names属性包含每级索引的名字,上述为None,是因为还没命名。

可以通过rename方法为index命名

data.index.rename("city",level = 0,inplace = True)
data.index.rename("dt",level = 1,inplace = True)

data.index.names

#输出FrozenList(['city', 'dt'])

二.行列转换(长宽互换)

(1) stack和unstack

California   

以上述数据为例

new_df 

512760d53c6a5b0657e71f827489128a.png

unstack() 方法可以快速将一个多级索引的 Series 转化为普通索引的 DataFrame,stack则可以实现将列转化为索引。

来看个实际的行列互换的例子

列转行
import 

c8a12ba3fb8f7d571507f808b377bd41.png
df 

8a0c8e80fd2595fe2ef23235218ee4e7.png

上述转化,可以看作是宽表转长表,很好记忆,将一组具有相同特征的列,转化成一列,自然就变窄了,同时为了一一对应,需要和其他列做组合,就会变长。

行转列

我们现在将以上数据进行反转操作。

df = df.set_index(["religion", "income"])["frequency"] #设置层级索引
df = df.untack() #索引转列

三.melt和pivot_table

这里放两张图,原图来自Medium(高质量的英文网站)

pivot_table透视表操作就是长表转宽表

melt操作可以看作则是宽表转长表

https://towardsdatascience.com/reshape-pandas-dataframe-with-pivot-table-in-python-tutorial-and-visualization-2248c2012a31​towardsdatascience.com

178e93c8f5bb314478b124a382ac029b.png

7b233ed61d306d84d14ef1b4221c4bc8.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值