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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python中的各种装饰器详解
Apr 11 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
python 获取网页编码方式实现代码
Mar 11 Python
Python编程求质数实例代码
Jan 31 Python
python如何通过实例方法名字调用方法
Mar 21 Python
Python 互换字典的键值对实例
Feb 12 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
pycharm 实现调试窗口恢复
Feb 05 Python
python爬虫selenium模块详解
Mar 30 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
详解JS预解析原理
2020/06/16 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python多继承原理与用法示例
2018/08/23 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python实现合并两个排序的链表
2019/03/03 Python
django 中QuerySet特性功能详解
2019/07/25 Python
python的链表基础知识点
2020/09/13 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
个人自我评价范文
2014/02/05 职场文书
群众路线党课主持词
2014/04/01 职场文书
幼儿园老师寄语
2014/04/03 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书