Pandas 数据分析小技巧系列 第五集

2020-12-17 16:24:15 浏览数 (1)

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,组合factorywarehouseretail 三个列名为一个维度,按照这种方法凑齐两个维度后,数据一定变长。

pandas 的 melt 方法演示如下:

代码语言:javascript复制
In [49]: df = df.melt(id_vars = "zip_code") 

若melt方法,参数value_vars不赋值,默认剩余所有列都是value_vars,所以结果如下:

代码语言:javascript复制
    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 赋值为它们即可:

代码语言:javascript复制
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 方法很容易做到:

代码语言:javascript复制
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个小技巧后,再去透视数据可能就会变得游刃有余一点。

下面是我微信,任何问题都可留言:

不必打赏

给我点个赞

就心满意足了

0 人点赞