重塑 (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="数据")
参考地址: