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 13 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
Python变量赋值的秘密分享
Apr 03 Python
对Python中range()函数和list的比较
Apr 19 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
python系列 文件操作的代码
Oct 06 Python
python将数组n等分的实例
Dec 02 Python
Python xlrd excel文件操作代码实例
Mar 10 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 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适配器模式介绍
2012/08/14 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
Python实现多行注释的另类方法
2014/08/22 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python装饰器的特性原理详解
2019/12/25 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
行政内勤岗位职责
2014/04/07 职场文书
小班上学期评语
2014/05/05 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
党建工作汇报材料
2014/12/24 职场文书
项目经理岗位职责
2015/01/31 职场文书
小学生交通安全寄语
2015/02/27 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android