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深入学习之装饰器
Aug 31 Python
python中的字典使用分享
Jul 31 Python
python2.7到3.x迁移指南
Feb 01 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
python实现列表的排序方法分享
Jul 01 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
python元组拆包实现方法
Feb 28 Python
python实现腾讯滑块验证码识别
Apr 27 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
javascript 闭包
2011/09/15 Javascript
php跨域调用json的例子
2013/11/13 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
详解jQuery选择器
2016/12/21 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
python实现井字棋游戏
2020/03/30 Python
Python实现的建造者模式示例
2018/08/06 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
python多线程与多进程及其区别详解
2019/08/08 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
Django中modelform组件实例用法总结
2020/02/10 Python
Django框架models使用group by详解
2020/03/11 Python
自主招生自荐信指南
2014/02/04 职场文书
迎新晚会策划方案
2014/06/13 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
学期个人自我总结
2015/02/13 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
护士岗位竞聘书
2015/09/15 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
Golang中channel的原理解读(推荐)
2021/10/16 Golang