Python pandas 列转行操作详解(类似hive中explode方法)


Posted in Python onMay 18, 2020

最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题。找了一番资料后成功了,记录一下。

1. 如果需要爆炸的只有一列:

df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]})
df
Out[1]: 
 A  B
0 1 [1, 2]
1 2 [1, 2]

如果要爆炸B这一列,可以直接用explode方法(前提是你的pandas的版本要高于或等于0.25)

df.explode('B')
 
  A B
 0 1 1
 1 1 2
 2 2 1
 3 2 2

2. 如果需要爆炸的有2列及以上

df=pd.DataFrame({'A':[1,2],'B':[[1,2],[3,4]],'C':[[1,2],[3,4]]})
df
Out[592]: 
 A  B  C
0 1 [1, 2] [1, 2]
1 2 [3, 4] [3, 4]

则可以用写一个方法,如下代码:

def unnesting(df, explode):
 idx = df.index.repeat(df[explode[0]].str.len())
 df1 = pd.concat([
  pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
 df1.index = idx
 
 return df1.join(df.drop(explode, 1), how='left')
 
 
unnesting(df,['B','C'])
Out[2]: 
 B C A
0 1 1 1
0 2 2 1
1 3 3 2
1 4 4 2

补充知识:pandas:一列分解成多列 series.str.split(',',expand=True);pyspark 一列分解成多列

源shuju

question_id       id
0   17576     70391,70394
1   17576  70391,70392,70393,70394
2   17576     70391,70392
3   40430   155032,155033,155034
4   40430 155032,155033,155034,155035
5   40430   155033,155034,155035
6   40430    155032,155035
7   40430    155034,155035
8   40430    155032,155034
9   40430   155032,155034,155035
10  40430    155033,155034
11  40430    155032,155033
12  40430    155033,155035
13  40430   155032,155033,155035

pandas solution

df.join(df['id'].str.split(',',expand=True)

result

0  1  2  3
0 70391 70394 None None
1 70391 70392 70393 70394
2 70391 70392 None None
3 155032 155033 155034 None
4 155032 155033 155034 155035
5 155033 155034 155035 None
6 155032 155035 None None
7 155034 155035 None None
8 155032 155034 None None
9 155032 155034 155035 None
10 155033 155034 None None
11 155032 155033 None None
12 155033 155035 None None
13 155032 155033 155035 None

#注意expand=True

df.join(df['id'].str.split(',',expand=True))

question_id       id  0  1  2  3
0   17576     70391,70394 70391 70394 None None
1   17576  70391,70392,70393,70394 70391 70392 70393 70394
2   17576     70391,70392 70391 70392 None None
3   40430   155032,155033,155034 155032 155033 155034 None
4   40430 155032,155033,155034,155035 155032 155033 155034 155035
5   40430   155033,155034,155035 155033 155034 155035 None
6   40430    155032,155035 155032 155035 None None
7   40430    155034,155035 155034 155035 None None
8   40430    155032,155034 155032 155034 None None
9   40430   155032,155034,155035 155032 155034 155035 None
10  40430    155033,155034 155033 155034 None None
11  40430    155032,155033 155032 155033 None None
12  40430    155033,155035 155033 155035 None None
13  40430   155032,155033,155035 155032 155033 155035 None
pyspark solution
 tdf=df.select(F.split(df.id,',').alias('ss'),'question_id','count_num')
 tdf.sort('question_id').show()
 res=tdf.select(F.explode(tdf.ss).alias('new'),'question_id','count_num')
res.sort('question_id').show()
res.groupBy('question_id','new').sum().sort('question_id').show()

result

Python pandas 列转行操作详解(类似hive中explode方法)

Python pandas 列转行操作详解(类似hive中explode方法)

以上这篇Python pandas 列转行操作详解(类似hive中explode方法)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中正则表达式的详细教程
Apr 30 Python
python实现ping的方法
Jul 06 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
python pygame实现2048游戏
Nov 20 Python
django中SMTP发送邮件配置详解
Jul 19 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Python 实现将某一列设置为str类型
Jul 14 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 Python
python实现学生信息管理系统源码
Feb 22 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
Win 10下Anaconda虚拟环境的教程
May 18 #Python
python异常处理之try finally不报错的原因
May 18 #Python
Pandas实现一列数据分隔为两列
May 18 #Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 #Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 #Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 #Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 #Python
You might like
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
SVG实现时钟效果
2018/07/17 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python编写猜数字小游戏
2019/10/06 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
见习期自我鉴定
2014/01/31 职场文书
岗位职责风险防控
2014/02/18 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
学用政策心得体会
2014/09/10 职场文书
召开会议通知范文
2015/04/15 职场文书
重阳节简报
2015/07/20 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL