Python与算法社区
第 446 篇原创,干货满满
三步加星标
01
02
03
三步加星标
你好,我是 zhenguo
今晚小技巧第五篇,做数据分析数据透视必不可少,数据透视让我们更加了解数据的规律。
Pandas 与透视相关的方法有 3 个,下面分别介绍使用它们的小技巧。
16 melt透视数据小技巧
melt 方法固定某列为一个维度,组合其他列名为另一个维度,实现宽表融化为长表:
代码语言:javascript复制 zip_code factory warehouse retail
0 12345 100 200 1
1 56789 400 300 2
2 101112 500 400 3
3 131415 600 500 4
固定列zip_code
,组合factory
,warehouse
,retail
三个列名为一个维度,按照这种方法凑齐两个维度后,数据一定变长。
pandas 的 melt 方法演示如下:
代码语言:javascript复制In [49]: df = df.melt(id_vars = "zip_code")
若melt方法,参数value_vars
不赋值,默认剩余所有列都是value_vars,所以结果如下:
zip_code variable value
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 warehouse 200
5 56789 warehouse 300
6 101112 warehouse 400
7 131415 warehouse 500
8 12345 retail 1
9 56789 retail 2
10 101112 retail 3
11 131415 retail 4
若只想查看 factory 和 retail,则 value_vars
赋值为它们即可:
In [62]: df_melt2 = df.melt(id_vars = "zip_code",value_vars=['factory','reta
...: il'])
结果:
代码语言:javascript复制zip_code variable value
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 retail 1
5 56789 retail 2
6 101112 retail 3
7 131415 retail 4
melt 透视数据后,因为组合多个列为1列,所以数据一定变长。
17 pivot 透视小技巧
melt 是融化数据,而 pivot
结冰数据,它们是一对互逆操作。
这是上面 melt 后的数据:
代码语言:javascript复制zip_code variable value
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 retail 1
5 56789 retail 2
6 101112 retail 3
7 131415 retail 4
现在想要还原为:
代码语言:javascript复制variable factory retail
zip_code
12345 100 1
56789 400 2
101112 500 3
131415 600 4
如何实现?
使用 pivot
方法很容易做到:
df_melt2.pivot(index='zip_code',columns='variable')
index 设定第一个轴,为 zip_code,columns 设定哪些列或哪个列的不同取值组合为一个轴,此处设定为 variable 列,它一共有 2 种不同的取值,分别为 factory, retail,pivot 透视后变为列名,也就是 axis = 1 的轴
pivot 方法没有聚合功能,它的升级版为 pivot_table
方法,能对数据聚合。
18 pivot_table 使用小技巧
使用上面的 df_melt 演示不出聚合的功能:
代码语言:javascript复制zip_code variable value
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 retail 1
5 56789 retail 2
6 101112 retail 3
7 131415 retail 4
因为 zip_code variable 的组合都是唯一的,因此转化一步,df_melt 基础上再 append 它:
代码语言:javascript复制In [77]: dfa = df_melt2.append(df_melt2)
数据变为:
代码语言:javascript复制 zip_code variable value
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 retail 1
5 56789 retail 2
6 101112 retail 3
7 131415 retail 4
0 12345 factory 100
1 56789 factory 400
2 101112 factory 500
3 131415 factory 600
4 12345 retail 1
5 56789 retail 2
6 101112 retail 3
7 131415 retail 4
此时前两列组合存在重复项,能够演示出聚合的效果:
代码语言:javascript复制dfa.pivot_table(index='zip_code',columns='variable',aggfunc=np.sum)
index 设定第一个维度:zip_code,columns 设定第二个维度为 variable,使用 aggfunc 参数做聚合,也就是存在 zip_code variable 重复项时,两项 np.sum 累加,透视结果如下:
代码语言:javascript复制 value
variable factory retail
zip_code
12345 200 2
56789 800 4
101112 1000 6
131415 1200 8
表格本质是二维结构,透视是变换二维表结构的艺术,掌握以上3个小技巧后,再去透视数据可能就会变得游刃有余一点。
下面是我微信,任何问题都可留言:
不必打赏
给我点个赞
就心满意足了