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列表去重的二种方法
Feb 14 Python
python友情链接检查方法
Jul 08 Python
python 网络爬虫初级实现代码
Feb 27 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
Django项目后台不挂断运行的方法
Aug 31 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
python取均匀不重复的随机数方式
Nov 27 Python
python装饰器相当于函数的调用方式
Dec 27 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
安装APACHE
2007/01/15 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
javascript时区函数介绍
2012/09/14 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
wxpython布局的实现方法
2019/11/01 Python
python制作朋友圈九宫格图片
2019/11/03 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
创业计划书的内容步骤和要领
2014/01/04 职场文书
2014政务公开实施方案
2014/02/19 职场文书
安全宣传标语口号
2014/06/06 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
家电创业计划书
2019/08/05 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Python PIL按比例裁剪图片
2022/05/11 Python