python应用与实践之(一)数据处理功能综合运用

在这个版块里面,会把平时遇到的一些很具体的功能实现问题进行总结,分享实现方法。

今天手头有一份数据,是2018和2019年分月的收入数据,数据是2018年和2019年的堆在一起的,我想看当年整体表现趋势及同比表现时就会不那么容易看,所以想到需要将数据做下转变,变成每年每月的收入横向拼接。
在这里插入图片描述
在这里插入图片描述
那么如何将纵向堆叠的数据变为横向拼接呢?
我一开始是这么做的:
1、提取出年=2018的
2、再提取出年=2019的
3、把两部分用concat做一个拼接(axis=1)。
我觉得这样做也可以,如果是两年的数据,那总共就是需要3行代码。
不过拼接后的数据中,2018和2019的各自列名都是一样的,需要事先修改了再拼接,否则之后提取时没法区分,所以就还得加上rename的步骤,一共是需要5句代码。(如果是3年的那么就需要3*2+1=7句)

后来好巧正好在看自己写的这篇文章,突然发现我文章中之前总结记录的这个应用与实践不就是正好解决我现在这个问题吗!醍醐灌顶的感觉。
把文章中的3句代码copy到我的代码中,稍作表名修改后,一运行,果然就实现了我拼接的目的,列名还一并都改掉了(加了后缀_2018 _2019),真是太棒了。

df1 = sales_df.set_index(['月','年']).unstack().sort_index(level=1, axis=1)
df1.columns = df1.columns.map('{0[0]}_{0[1]}'.format)
df1=df1.sort_index().reset_index()

以上两种方法,一种易懂,一种功能强大,各取所需~

以下是旧文
########################################
待解决的问题,待实现的功能
要将A列中值相等的行记录转换为列,并对A列中相同值对应的记录进行拼接合并。将多个行组合成一行。
也就是要将以下表1,转换成表2的形式,该如何实现?
在这里插入图片描述
解决方案:

  • 首先,根据A列中的值对DataFrame进行分组并累计计数:df.groupby([‘A’]).cumcount() +1
  • 然后,把A列和groupby后生成的列设置为多层索引:df.set_index([‘A’,df.groupby([‘A’]).cumcount() +1])
  • 再将多层索引DataFrame拆堆,变为列双层索引:df.set_index([‘A’,df.groupby([‘A’]).cumcount() +1]).unstack()
  • 根据列索引中的level1进行排序:df.set_index([‘A’,df.groupby([‘A’]).cumcount() +1]).unstack().sort_index(level=1, axis=1)
  • 最后,再根据需求对列名,索引排序进行调整。

注意这里最后一步用到了分层索引中的levels,类似下图所示,在倒数第2步做完后,df表的列其实是变成了两层索引,这时候使用map和format的作用其实就是,给原本的列名添加后缀,后缀就是_再加上第2层索引中对应的值
在这里插入图片描述

df=pd.read_excel(r'C:\Users\Desktop\A.xlsx')
df1 = df.set_index(['A',df.groupby(['A'])\
.cumcount() +1]).unstack().sort_index(level=1, axis=1)
df1.columns = df1.columns.map('{0[0]}_{0[1]}'.format)
df1=df1.sort_index().reset_index()

知识点总结

  • 数据聚合与分组(groupby)
  • 使用DataFrame的列进行索引(set_index)
  • 使用多层索引进行数据重塑(拆堆)(unstack)
  • 层级排序 (sort_index)
  • 分层索引MultiIndex的levels使用
  • Series的map方法(map)
  • 格式化字符串(format)

有任何疑问欢迎在留言区里和我讨论,互相学习!如果有帮助到你,也麻烦点点赞哦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值