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中的map、reduce和filter浅析
Apr 26 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
Python调用C++程序的方法详解
Jan 24 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
Python解决八皇后问题示例
Apr 22 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
Django处理多用户类型的方法介绍
May 18 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
python tkinter组件使用详解
Sep 16 Python
基于python纯函数实现井字棋游戏
May 27 Python
python查询MySQL将数据写入Excel
Oct 29 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 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获取汉字的拼音(全部与首字母)
2013/06/27 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
js仿360开机效果
2019/12/26 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
python中split方法用法分析
2015/04/17 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python输出各行命令详解
2018/02/01 Python
python实现顺时针打印矩阵
2019/03/02 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
住宅质量保证书
2014/04/29 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
总结Java对象被序列化的两种方法
2021/06/30 Java/Android