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程序中操作文件之flush()方法的使用教程
May 24 Python
python删除特定文件的方法
Jul 30 Python
Python制作刷网页流量工具
Apr 23 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
python logging添加filter教程
Dec 24 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
Python如何读写CSV文件
Aug 13 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
pytorch实现线性回归以及多元回归
Apr 11 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实现的在线人员函数库
2008/04/09 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php微信公众号开发之简答题
2018/10/20 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
Puppeteer使用示例详解
2019/06/20 Python
wxPython实现分隔窗口
2019/11/19 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
《金钱的魔力》教学反思
2014/02/24 职场文书
房屋转让协议书范本
2014/04/11 职场文书
活动总结怎么写
2014/04/28 职场文书
建筑工地质量标语
2014/06/12 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书