🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 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)