### 2.4.1. 重塑 reshape
![](https://img.kancloud.cn/0a/b5/0ab58d67da5b9e59ef918598829273e3_1257x644.png)
```
df = pd.DataFrame({'foo': ['one','one','one','two','two','two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6]})
df
```
![](https://img.kancloud.cn/2f/9b/2f9b4b3bc993e92c339781e28318369e_181x299.png)
```
#pivot将foo列不重复的值变为索引列。bar列不重复的值变为列名。使用pivot index和columns列组合不能有重复的。两列的唯一组合对应同行的数据值
df.pivot(index='foo', columns='bar', values='baz')
```
![](https://img.kancloud.cn/79/16/7916d6c0fd2f2b8d6a31b165c60390c4_158x177.png)
*****
最常用的地方是时间序列数据:
* date:代表日期
* group:代表销售小组
* sells:销售小组的业绩
index是日期用来表示每一条观测值,columns就是唯一的变量!
```
from datetime import datetime,timedelta
today = datetime.now().date()
#获取从今天到4天前的5个日期,把这五个值复制6遍放入一个列表中
date = [today - timedelta(days = i) for i in range(5)] * 6
# a,b,c,d,e,f各复制5次放到一个列表中。列表可以通过+拼接到一起
group = ['A']*5 + ['B'] * 5 + ['C']*5 + ['D'] * 5 +['E']*5 +['F']*5
# 生成1000到100000的30个值,放到一个列表中
sells = np.random.randint(1000,100000,size = (30,)).tolist()
#创建字典
data = {"date":date,"group":group,"sells":sells}
#根据字典生成dataFrame
df_pivot = pd.DataFrame(data)
# dataFrame值排序,先按组排,组内再按日期排
df_pivot.sort_values(['group','date'])
```
![](https://img.kancloud.cn/3f/4b/3f4bb7514ef0472f05165e5073a1b3b3_343x288.png)
*****
```
df_pivot.pivot(index='date',columns='group',values='sells')
```
![](https://img.kancloud.cn/b0/19/b01922fece6346c53e7fcf6ed8dabd43_555x300.png)
*****
如果没有指定values参数,程序会计算出所有可被计算的列,并在最上方形成多层索引
```
df_pivot['cumsells'] = df_pivot['sells']*2+1000
df_pivot
```
![](https://img.kancloud.cn/79/c4/79c40a57d66ef8157bb5344be9e988c8_390x502.png)
```
#多个列的值被计算显示出来,并在最上方形成多层索引
df_pivot.pivot(index='date',columns='group')
```
![](https://img.kancloud.cn/5b/38/5b3802c85d9c69ab645a6ebaed2046bb_986x355.png)
*****
**STACK**
![](https://img.kancloud.cn/b6/5d/b65df2a526ffd67b467fea64c4ce4d68_1221x539.png)
**stack()与 unstack()** 函数都是用于多重索引的
* stack():column转换成index
* unstack():index转换成column
```
# 将列表变成元组
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two',
'one', 'two', 'one', 'two']]))
#根据元组创建多层索引,第一二层分别命名为first second
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
# 随机生成8*2的数,index作为索引,初始化列名
df_mul = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
```
![](https://img.kancloud.cn/f4/d0/f4d02b5127dd77a72d5cb0f776cc5f1d_338x483.png)
```
# 把列名也变成索引,由索引和列对应的值转换为每个值可以由索引直接确定
df_mul.stack()
```
![](https://img.kancloud.cn/58/be/58be65fa0e89c75e1b6cb1dbd5d14922_273x344.png)
新生成的数据集会形成多少行呢?
* m : 行数
* n: 列数
* 总数量:m * n
*****
stack()和unstack()可以看做互逆过程。unstack将由多层索引可以直接确定的值转换为有多层索引和列名确定一个值
![](https://img.kancloud.cn/d2/1f/d21fa077cf098671e34035b35d40bfd0_1080x575.png)
![](https://img.kancloud.cn/7c/e4/7ce4c1499e0540d2235c540d98fd39ae_1024x567.png)
![](https://img.kancloud.cn/f4/87/f4873093b13c7a0adb1d1810fa5abd9e_1080x573.png)
*****
**Melt**
![](https://img.kancloud.cn/7c/8d/7c8df0549056bdf71bd238fa5b4cefa3_1065x495.png)
某些列设置为标记变量,其它的列被设置为衡量变量。函数会自动生成两列:“variable” and “value”,我们也可以通过 var_name 和 value_name 两个参数自定义列名。
```
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
```
![](https://img.kancloud.cn/e2/ff/e2ff9d7f4100ba82d9d6e6058878f816_705x238.png)
![](https://img.kancloud.cn/85/01/8501b404d79c78f84a72291a372f74d7_680x240.png)
*****
### 2.4.2. 透视表 pivot table
这部分看《利用Python进行数据分析》10.4节
```
import numpy as np
pd.pivot_table(df,values = ['duration'],columns = ['director_name'],index=['color'],aggfunc=[np.sum],margins=True)
```
**pivot_table** 提供了类似于EXCEL数据透视表的功能,重点的参数如下:
![](https://img.kancloud.cn/58/ce/58ce4dfbe2880c36b5f905933ba036b1_1451x290.png)
![](https://img.kancloud.cn/4d/03/4d03e8f6bdc0d6b3d5b264c460f2ccc7_1402x298.png)
*****
**crosstab**
用于计算两个以上的因子的cross-tabulation. 默认的是计算因子之间的频率
![](https://img.kancloud.cn/a4/c1/a4c1bbe9ca892c3e184a276c54f1c086_610x498.png)
*****
![](https://img.kancloud.cn/de/34/de344a733615ada277341b1717a1d739_1428x556.png)
- 第五节 Pandas数据管理
- 1.1 文件读取
- 1.2 DataFrame 与 Series
- 1.3 常用操作
- 1.4 Missing value
- 1.5 文本数据
- 1.6 分类数据
- 第六节 pandas数据分析
- 2.1 索引选取
- 2.2. 分组计算
- 2.3. 表联结
- 2.4. 数据透视与重塑(pivot table and reshape)
- 2.5 官方小结图片
- 第七节 NUMPY科学计算
- 第八节 python可视化
- 第九节 统计学
- 01 单变量
- 02 双变量
- 03 数值方法
- 第十节 概率
- 01 概率
- 02 离散概率分布
- 03 连续概率分布
- 第一节 抽样与抽样分布
- 01抽样
- 02 点估计
- 03 抽样分布
- 04 抽样分布的性质
- 第十三节 区间估计
- 01总体均值的区间估计:𝝈已知
- 02总体均值的区间估计:𝝈未知
- 03总体容量的确定
- 04 总体比率