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 (2)
Oct 31 Python
python异步任务队列示例
Apr 01 Python
python字符串对其居中显示的方法
Jul 11 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
有关Python的22个编程技巧
Aug 29 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
Django通过json格式收集主机信息
May 29 Python
python简单实现插入排序实例代码
Dec 16 Python
Python爬取某平台短视频的方法
Feb 08 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP分页类集锦
2014/11/18 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
公务员培训心得体会
2013/12/28 职场文书
老师对学生的寄语
2014/04/09 职场文书
课外活动总结范文
2014/07/09 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
内勤岗位职责范本
2015/04/13 职场文书
作息时间调整通知
2015/04/22 职场文书
转学证明范本
2015/06/19 职场文书