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 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
python监控文件或目录变化
Jun 07 Python
使用Python对Csv文件操作实例代码
May 12 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python中sys.argv函数精简概括
Jul 08 Python
python实现控制台打印的方法
Jan 12 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
php基本函数汇总
2015/07/09 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
浅析Git版本控制器使用
2017/12/10 Python
Python中的默认参数实例分析
2018/01/29 Python
浅述python中深浅拷贝原理
2018/09/18 Python
python配置grpc环境
2019/01/01 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
经济管理专业毕业生推荐信
2013/11/11 职场文书
大学生新闻专业个人自我评价
2013/11/12 职场文书
考试不及格的检讨书
2014/01/22 职场文书
通信工程求职信
2014/07/16 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
写给父母的感谢信
2015/01/22 职场文书
结婚堵门保证书
2015/05/08 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis