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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
微信跳一跳游戏python脚本
Apr 01 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
Python中字符串与编码示例代码
May 20 Python
Python PyCharm如何进行断点调试
Jul 05 Python
python3的url编码和解码,自定义gbk、utf-8的例子
Aug 22 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
基于python实现生成指定大小txt文档
Jul 20 Python
PyQt5中QSpinBox计数器的实现
Jan 18 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
再说下636单管机
2021/03/02 无线电
再次研究下cache_lite
2007/02/14 PHP
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP生成plist数据的方法
2015/06/16 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
python处理json数据中的中文
2014/03/06 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
django框架自定义用户表操作示例
2018/08/07 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
python3中for循环踩过的坑记录
2020/12/14 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
书法比赛获奖感言
2014/02/10 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
优秀求职信
2014/05/29 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS