前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas基础:列方向分组变形

Pandas基础:列方向分组变形

作者头像
朱小五
发布2021-02-22 11:28:42
1.4K0
发布2021-02-22 11:28:42
举报
文章被收录于专栏:凹凸玩数据凹凸玩数据

小小明:「凹凸数据」专栏作者,Pandas数据处理高手,致力于帮助无数数据从业者解决数据处理难题。

刚才碰到一个非常简单的需求:

但是我发现大部分人在做这个题的时候,代码写的异常复杂。所以我建议你也不要直接看我的代码,而是先思考一下,你会怎么解决这个问题。

首先读取数据:

代码语言:javascript
复制
import pandas as pd

df = pd.read_excel("练习.xlsx", index_col=0)
df

结果:

为了后续处理方便,我将不需要参与分组的第一列事先设置为索引。

groupby分组相信大部分读者都使用过,但一直都是按行分组,不过groupby不仅可以按行分组,还可以按列进行分组

完整处理代码:

代码语言:javascript
复制
result = []
for year, split in df.groupby(df.columns.str[:4], axis=1):
    split.rename(columns=lambda s: s[5:], inplace=True)
    split.reset_index(inplace=True)
    split["年份"] = year
    result.append(split)
result = pd.concat(result, ignore_index=True)
result

结果:

可以看到,非常简单,仅8行以内的代码已经解决这个问题,剩下的只需在保存到excel时设置一下单元格格式即可,具体设置方法可以参考:Pandas指定样式保存excel数据的N种姿势

简单讲解一下吧:

代码语言:javascript
复制
df.columns.str[:4]

结果:

代码语言:javascript
复制
Index(['2018', '2019', '2020', '2018', '2019', '2020'], dtype='object')

截取每列列名前4个字符,传入groupby即可作为分组依据,axis=1则指定了groupby按列进行分组而不是默认的按行分组。

代码语言:javascript
复制
split.rename(columns=lambda s: s[5:], inplace=True)

表示对分组后的结果去除列名的前5个字符。

代码语言:javascript
复制
split.reset_index(inplace=True)

表示还原索引为普通的列。

代码语言:javascript
复制
split["年份"] = year

将年份添加到后面单独的一列。

总之这个问题非常简单,相信大部分读者在看到代码后已经秒懂。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 凹凸数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档