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二分法实现实例
Nov 21 Python
Python实现基于HTTP文件传输实例
Nov 08 Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 Python
Python输出9*9乘法表的方法
May 25 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
Python Socket编程详细介绍
Mar 23 Python
详解Django中间件执行顺序
Jul 16 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
pytorch fine-tune 预训练的模型操作
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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
vue axios用法教程详解
2017/07/23 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
python 异常处理总结
2016/10/18 Python
python发送告警邮件脚本
2018/09/17 Python
python-opencv颜色提取分割方法
2018/12/08 Python
python assert的用处示例详解
2019/04/01 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
Python对列表的操作知识点详解
2019/08/20 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Django model class Meta原理解析
2020/11/14 Python
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
Delphi CS笔试题
2014/01/04 面试题
Delphi软件工程师试题
2013/01/29 面试题
2014的自我评价
2014/01/13 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
奔腾年代观后感
2015/06/09 职场文书
好人好事新闻稿
2015/07/17 职场文书
诚信高考倡议书
2019/06/24 职场文书