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使用chardet判断字符串编码的方法
Mar 13 Python
Python2中的raw_input() 与 input()
Jun 12 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
Python生成一个迭代器的实操方法
Jun 18 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
python实现倒计时小工具
Jul 29 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
Django admin 实现search_fields精确查询实例
Mar 30 Python
django实现日志按日期分割
May 21 Python
Python错误的处理方法
Jun 23 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
车间班组长岗位职责
2013/11/13 职场文书
班级文化标语
2014/06/23 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
MySQL数据库表约束讲解
2022/06/21 MySQL