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中实现参数类型检查的简单方法
Apr 21 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
python 插入日期数据到Oracle实例
Mar 02 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
python自动化测试之Selenium详解
Mar 13 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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
改变Apache端口等配置修改方法
2008/06/05 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
php实现websocket实时消息推送
2018/03/30 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
windows下python连接oracle数据库
2017/06/07 Python
Python中pillow知识点学习
2018/04/30 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
django 微信网页授权登陆的实现
2019/07/30 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
社区志愿者活动总结
2014/06/26 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
河童之夏观后感
2015/06/11 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书