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中用Descriptor实现类级属性(Property)详解
Sep 18 Python
python处理csv数据的方法
Mar 11 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
利用python循环创建多个文件的方法
Oct 25 Python
python中几种自动微分库解析
Aug 29 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
通俗讲解python 装饰器
Sep 07 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
python基于机器学习预测股票交易信号
May 25 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
php4的session功能评述(一)
2006/10/09 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PDO::errorCode讲解
2019/01/28 PHP
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python添加模块搜索路径方法
2017/09/11 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
python 实现登录网页的操作方法
2018/05/11 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
python批量修改图片大小的方法
2018/07/24 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
使用Pycharm分段执行代码
2020/04/15 Python
python3字符串输出常见面试题总结
2020/12/01 Python
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
大学生军训感想
2014/02/16 职场文书
门面房租房协议书
2014/12/01 职场文书
公司车辆管理制度
2015/08/04 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
修改并编译golang源码的操作步骤
2021/07/25 Golang
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL