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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
Python入门篇之面向对象
Oct 20 Python
Python查询IP地址归属完整代码
Jun 21 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
Python基于requests库爬取网站信息
Mar 02 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
Matplotlib中rcParams使用方法
Jan 05 Python
Python+Appium自动化测试的实战
Jun 30 Python
python神经网络Xception模型
May 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
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP insert语法详解
2008/06/07 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
理解javascript对象继承
2016/04/17 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
python 实现归并排序算法
2012/06/05 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
python中update的基本使用方法详解
2019/07/17 Python
Python读取实时数据流示例
2019/12/02 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
中专毕业生自我鉴定范文
2013/11/09 职场文书
微笑服务演讲稿
2014/05/13 职场文书
南京青奥会口号
2014/06/12 职场文书
效能风暴心得体会
2014/09/04 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
保研推荐信范文
2015/03/25 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
新员工入职感言范文!
2019/07/04 职场文书