Pandas实现一列数据分隔为两列


Posted in Python onMay 18, 2020

分割成一个包含两个元素列表的列

对于一个已知分隔符的简单分割(例如,用破折号分割或用空格分割).str.split() 方法就足够了 。 它在字符串的列(系列)上运行,并返回列表(系列)。

>>> import pandas as pd
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
>>> df

  AB
0 A1-B1
1 A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df

  AB AB_split
0 A1-B1 [A1, B1]
1 A2-B2 [A2, B2]

分割成两列,每列包含列表的相应元素

下面来看下如何从:分割成一个包含两个元素列表的列至分割成两列,每列包含列表的相应元素。

>>> df['AB'].str[0]

0 A
1 A
Name: AB, dtype: object

>>> df['AB'].str[1]

0 1
1 2
Name: AB, dtype: object

因此可以得到

>>> df['AB'].str.split('-', 1).str[0]

0 A1
1 A2
Name: AB, dtype: object

>>> df['AB'].str.split('-', 1).str[1]

0 B1
1 B2
Name: AB, dtype: object

可以通过如下代码将pandas的一列分成两列:

>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str
>>> df

  AB AB_split A B
0 A1-B1 [A1, B1] A1 B1
1 A2-B2 [A2, B2] A2 B2

补充知识:pandas某一列中每一行拆分成多行的方法

在处理数据过程中,常会遇到将一条数据拆分成多条,比如一个人的地址信息中,可能有多条地址,既有家庭地址也有工作地址,还有电话信息等等类似的情况,实际使用数据的时候又需要分开处理,这个时候就需要将这一条数据进行拆分成多条,以方便使用。

在pandas中如何对DataFrame进行相关操作呢,经查阅相关资料,发现了一个简单的办法,

info.drop(['city'], axis=1).join(info['city'].str.split(' ', expand=True).stack().reset_index(level=1, drop=True).rename('city'))

看起来非常之长,分开来看,流程如下:

将需要拆分的数据使用split拆分工具拆分,并使用expand功能拆分成多列

将拆分后的多列数据进行列转行操作(stack),合并成一列

将生成的复合索引重新进行reset保留原始的索引,并命名

将上面处理后的DataFrame和原始DataFrame进行join操作,默认使用的是索引进行连接

具体操作如下:

预操作:生成需要使用的DataFrame

# 用来生成DataFrame的工具
from pydbgen import pydbgen
myDB=pydbgen.pydb()

# 生成一个DataFrame
info = myDB.gen_dataframe(10,['name','phone','city','state'])

结果如下:

name phone-number city state
0 Hannah Richard 810-859-7815 Irwinville Louisiana
1 Ronald Berry 591-564-0585 Glen Ellen Minnesota
2 Caitlin Barron 969-840-8580 Dubois Oklahoma
3 Felicia Stephens 154-858-1233 Veedersburg Alaska
4 Shelly Dennis 343-104-9365 Mattapex Virginia
5 Nicholas Hill 992-239-1954 Moneta Minnesota
6 Steve Bradshaw 164-081-7811 Ten Broeck Colorado
7 Gail Johnston 155-259-9514 Wayan Virginia
8 John Gray 409-892-4716 Darlington Pennsylvania
9 Katherine Bautista 185-861-1677 McNab Texas

假如现在我们要对city列进行进行拆分,按照空格拆分,转换成多行的数据,
第一步:拆分,生成多列

info_city = info['city'].str.split(' ', expand=True)

结果如下:

0 1
0 Irwinville None
1 Glen Ellen
2 Dubois None
3 Veedersburg None
4 Mattapex None
5 Moneta None
6 Ten Broeck
7 Wayan None
8 Darlington None
9 McNab None

可以看到已经将原始数据拆分成了2列,对于无法拆分的数据为None

第二步:行转列

info_city = info_city.stack()

结果如下:

0 0 Irwinville
1 0 Glen
1 Ellen
2 0 Dubois
3 0 Veedersburg
4 0 Mattapex
5 0 Moneta
6 0 Ten
1 Broeck
7 0 Wayan
8 0 Darlington
9 0 McNab

其中前面两列是索引,返回的是一个series,没有名字的series

第三步:重置索引,并命名(并删除多于的索引)

info_city = info_city.reset_index(level=1, drop=True)

结果如下:

0 Irwinville
1 Glen
1 Ellen
2 Dubois
3 Veedersburg
4 Mattapex
5 Moneta
6 Ten
6 Broeck
7 Wayan
8 Darlington
9 McNab

第四步:和原始数据合并

info_new = info.drop(['city'], axis=1).join(info_city)

结果如下:

name phone-number state city
0 Hannah Richard 810-859-7815 Louisiana Irwinville
1 Ronald Berry 591-564-0585 Minnesota Glen
1 Ronald Berry 591-564-0585 Minnesota Ellen
2 Caitlin Barron 969-840-8580 Oklahoma Dubois
3 Felicia Stephens 154-858-1233 Alaska Veedersburg
4 Shelly Dennis 343-104-9365 Virginia Mattapex
5 Nicholas Hill 992-239-1954 Minnesota Moneta
6 Steve Bradshaw 164-081-7811 Colorado Ten
6 Steve Bradshaw 164-081-7811 Colorado Broeck
7 Gail Johnston 155-259-9514 Virginia Wayan
8 John Gray 409-892-4716 Pennsylvania Darlington
9 Katherine Bautista 185-861-1677 Texas McNab

需要特别注意的是,需要使用原始的连接新生成的,因为新生成的是一个series没有join方法,也可以通过将生成的series通过to_frame方法转换成DataFrame,这样就没有什么差异了

写了这么多,记住下面的就行了:

info.drop([‘city'], axis=1).join(info[‘city'].str.split(' ', expand=True).stack().reset_index(level=1, drop=True).rename(‘city'))

如果原数据中已经是list了,可以将info[‘city'].str.split(' ', expand=True)这部分替换成info[‘city'].apply(lambda x: pd.Series(x)),就可以达到相同的目的。

以上这篇Pandas实现一列数据分隔为两列就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 通过URL打开图片实例详解
Jun 01 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
浅析python中while循环和for循环
Nov 19 Python
python 解决cv2绘制中文乱码问题
Dec 23 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
django有哪些好处和优点
Sep 01 Python
python 通过exifread读取照片信息
Dec 24 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 #Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 #Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 #Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 #Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 #Python
django queryset相加和筛选教程
May 18 #Python
python中JWT用户认证的实现
May 18 #Python
You might like
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
python基于递归解决背包问题详解
2019/07/03 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Python:slice与indices的用法
2019/11/25 Python
Python super()方法原理详解
2020/03/31 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
2014年党员自我评议(5篇)
2014/09/12 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript