Pandas 数据分析 实用小技巧(四)

Pandas 数据分析 实用小技巧(四)

16 melt透视数据小技巧

melt 方法固定某列为一个维度,组合其他列名为另一个维度,实现宽表融化为长表:

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 方法演示如下:

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'])

结果:

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 后的数据:

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

现在想要还原为:

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 演示不出聚合的功能:

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 它:

In [77]: dfa = df_melt2.append(df_melt2)

数据变为:

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

此时前两列组合存在重复项,能够演示出聚合的效果:

dfa.pivot_table(index='zip_code',columns='variable',aggfunc=np.sum)

index 设定第一个维度:zip_code,columns 设定第二个维度为 variable,使用 aggfunc 参数做聚合,也就是存在 zip_code + variable 重复项时,两项 np.sum 累加,透视结果如下:
image.png
表格本质是二维结构,透视是变换二维表结构的艺术,掌握以上3个小技巧后,再去透视数据可能就会变得游刃有余一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值