Pandas重塑和透视

重塑 (reshape) 和透视 (pivot) 两个操作只改变数据表的布局 (layout):
重塑用 stack(列索引—>行索引) 和 unstack 函数 (行索引—>列索引)(互为逆转操作)
透视用 pivot 和 melt 函数 (互为逆转操作)

重塑

基本演示

现在来造几个数据

symbol = ['JD', 'AAPL']
data = {
    
    '行业': ['电商', '科技'],'价格': [25.95, 172.97],'交易量': [27113291, 18913154]}
df = pd.DataFrame( data, index=symbol )
df.columns.name = '特征'
df.index.name = '代号'

结果截图
使用stack()unstack()

q = df.stack() 或者添加参数 df.stack('特征')
q = df.unstack() 或者添加参数 df.unstack('代号')

效果截图

仔细观察上方的输出结果,可以发现stack方法将df的列索引加到了df的行索引的后面变成多级索引(MultiIndex),而unstack 是将df的行索引加到df的行索引后面变成多级索引(MultiIndex)。

多层DataFrame

data = [ 
	['电商', 101550, 176.92], 
	['电商', 175336, 25.95], 
	['金融',60348, 41.79], 
	['金融', 36600, 196.00] ]
midx = pd.MultiIndex( levels=[['中国','美国'], ['BABA','JD', 'GS', 'MS']],
					  labels=[[0,0,1,1],[0,1,2,3]],
					  names = ['地区', '代号'])
mcol = pd.Index(['行业','雇员','价格'], name='特征')
df = pd.DataFrame( data, index=midx, columns=mcol )

数据结构
由上图可知行一级索引是地区【中国、美国】,二级索引是代号【BAB、JD、GS、MS】,列索引是特征【行业、雇员、价格】

基于多层索引使用unstack(列–>行)

	df.unstack(0)
	df.unstack(1)

运行截图
它们的行索引、列索引分别是下图所述,列索引变成多级索引
在这里插入图片描述
还可以联合套用

df.unstack(0).stack(1)

结果截图
他们的行索引和列索引分别是:
行列索引
还有多种情况可以操作,有兴趣的可以多多尝试!

透视

透视:平面或曲面上描绘物体的空间关系的方法或技术 数据源表通常只包含行和列,那么经常有重复值出现在各列下,因而导致源表不能传递有价值的信息。这时可用「透视」方法调整源表的布局用作更清晰的展示。
在Pandas中透视主要有两种方法:

  • 用pivot函数将「一张长表」变成「多张宽表」
  • 用melt将「多张宽表」变成「一张长表」

piovt_table

piovt() 方法只是把列数据转换为行索引和类索引,下面先来介绍piovt_table()可操作程度大大提高,它既是顶级类函数,也是实例对象函数。
先来引入几个数据
数据源

pd.pivot_table(data, values=None, 
				index=None, columns=None, 
				aggfunc='mean', fill_value=None, 
				margins=False,dropna=True, 	
				margins_name='All')

参数说明:
参数说明
示例

import numpy as np
import pandas as pd
table = pd.pivot_table(df,index=["Manager","Status"],columns=["Product"],
values=["Quantity","Price"],aggfunc={
    
    "Quantity":len,"Price":[np.sum,np.mean]},fill_value='w')

结果

pivot

这里有几个参数

参数 描述
index 重塑后的索引名称
columns 重塑后的新表的列名
values 生成新列的值

先造几个数据

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {
    
    'a':np.arange(5),
     'b':np.arange(10,20,2),
     'c':np.asarray(['A','B','C','D','E']) 
    }) 
	df.pivot(index='c', columns='a',values='b')

结果截图
大体意思就是如此,我们可以将重塑好的数据进行存储,添加到新表等一系列操作。

melt

melt可以理解为pivot的对立方法
参数如下:

参数 说明
id_vars 不需要被转换的列名,在转换后作为标识符列
value_vars 需要被转换的现有列
var_name 设置由 ‘value_vars’ 组成的新的列名
value_name 设置由 ‘value_vars’ 的数据组成的新的 列名
col_level 列是MultiIndex,则使用此级别
# 接着上面的数据
df.melt(id_vars="c",value_vars=["b","a"],var_name="列名",value_name="数据")

结果截图

参考地址:

猜你喜欢

转载自blog.csdn.net/qq_44091773/article/details/106113566