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实现带声音的摩斯码翻译实现方法
May 20 Python
Python fileinput模块使用实例
May 28 Python
简单理解Python中的装饰器
Jul 31 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
如何在python中写hive脚本
Nov 08 Python
详解Python中的Lock和Rlock
Jan 26 Python
Python 多线程处理任务实例
Nov 07 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
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
ECMAScript6函数默认参数
2015/06/12 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
JavaScript中如何调用Java方法
2020/09/16 Javascript
Python基础学习之常见的内建函数整理
2017/09/06 Python
python文本数据相似度的度量
2018/03/12 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
Python爬虫文件下载图文教程
2018/12/23 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
python实现广度优先搜索过程解析
2019/10/19 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
keras中的backend.clip用法
2020/05/22 Python
幼儿师范毕业生自荐信
2013/11/09 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
工作简历自我评价
2015/03/11 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
vscode中使用npm安装babel的方法
2021/08/02 Javascript
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android