Pandas使用分隔符或正则表达式将字符串拆分为多列
作者:饺子大人 发布时间:2022-03-05 13:52:54
Pandas如何将带有字符串元素的列拆分为多个列。
使用以下字符串的方法。
str.split():用定界符分割
str.extract():按正则表达式拆分
字符串方法是pandas.Series方法。
适用于pandas.Series或pandas.DataFrame列
str.split():用定界符分割
要按定界符(delimiter)进行拆分,使用字符串方法str.split()。
pandas.Series
以以下pandas.Series为例。
import pandas as pd
s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D'])
print(s_org)
print(type(s_org))
# A aaa@xxx.com
# B bbb@yyy.com
# C ccc@zzz.com
# D ddd
# dtype: object
# <class 'pandas.core.series.Series'>
将定界符指定为第一个参数。一个pandas.Series元素作为拆分字符串的列表返回。
s = s_org.str.split('@')
print(s)
print(type(s))
# A [aaa, xxx.com]
# B [bbb, yyy.com]
# C [ccc, zzz.com]
# D [ddd]
# dtype: object
# <class 'pandas.core.series.Series'>
指定split = True作为参数可分为多个列并以pandas.DataFrame的形式获取。默认值为expand = False。
没有足够的行划分的元素为“无(None)”。
df = s_org.str.split('@', expand=True)
print(df)
print(type(df))
# 0 1
# A aaa xxx.com
# B bbb yyy.com
# C ccc zzz.com
# D ddd None
# <class 'pandas.core.frame.DataFrame'>
可以在列中指定获取的pandas.DataFrame的列名。
df.columns = ['local', 'domain']
print(df)
# local domain
# A aaa xxx.com
# B bbb yyy.com
# C ccc zzz.com
# D ddd None
pandas.DataFrame
如果要通过将pandas.DataFrame的特定列拆分为多列来更新它,这会有些乏味。可能有更好的方法。
以先前创建的pandas.DataFrame为例。
print(df)
# local domain
# A aaa xxx.com
# B bbb yyy.com
# C ccc zzz.com
# D ddd None
在特定的列上使用str.split()获得一个拆分的pandas.DataFrame。
print(df['domain'].str.split('.', expand=True))
# 0 1
# A xxx com
# B yyy com
# C zzz com
# D None None
使用pd.concat()与原始pandas.DataFrame进行串联(联接),并使用drop()方法删除原始列。
df2 = pd.concat([df, df['domain'].str.split('.', expand=True)], axis=1).drop('domain', axis=1)
print(df2)
# local 0 1
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D ddd None None
如果剩余的列很少,则只能选择与pd.concat()串联(联接)时所需的列。
df3 = pd.concat([df['local'], df['domain'].str.split('.', expand=True)], axis=1)
print(df3)
# local 0 1
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D ddd None None
要重命名特定的列,请使用rename()方法。
df3.rename(columns={0: 'second_LD', 1: 'TLD'}, inplace=True)
print(df3)
# local second_LD TLD
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D ddd None None
参考文章
Pandas.DataFrame的行名和列名的修改
str.extract():按正则表达式拆分
使用字符串方法str.extract()分割正则表达式。
以以下pandas.Series为例。
import pandas as pd
s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D'])
print(s_org)
# A aaa@xxx.com
# B bbb@yyy.com
# C ccc@zzz.com
# D ddd
# dtype: object
在第一个参数中指定正则表达式。对于每个与正则表达式中用()括起来的组部分匹配的字符串,均对其进行划分。
提取多个组时,无论参数expand如何,都将返回pandas.DataFrame。
如果不匹配,则为NaN。
df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=True)
print(df)
# 0 1 2
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D NaN NaN NaN
df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=False)
print(df)
# 0 1 2
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D NaN NaN NaN
如果只有一组,则当参数expand = True时返回pandas.DataFrame,如果expand = False则返回pandas.Series。
df_single = s_org.str.extract('(\w+)', expand=True)
print(df_single)
print(type(df_single))
# 0
# A aaa
# B bbb
# C ccc
# D ddd
# <class 'pandas.core.frame.DataFrame'>
s = s_org.str.extract('(\w+)', expand=False)
print(s)
print(type(s))
# A aaa
# B bbb
# C ccc
# D ddd
# dtype: object
# <class 'pandas.core.series.Series'>
Expand = False是当前版本0.22.0中的默认值,但expand = True将是将来的默认值。
FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame)
but in a future version of pandas this will be changed to expand=True (return DataFrame)
如果对正则表达式模式使用命名组(?P …),则该名称将按原样是列名。
df_name = s_org.str.extract('(?P<local>.*)@(?P<second_LD>.*)\.(?P<TLD>.*)', expand=True)
print(df_name)
# local second_LD TLD
# A aaa xxx com
# B bbb yyy com
# C ccc zzz com
# D NaN NaN NaN
如果要通过将pandas.DataFrame的特定列划分为多个列来进行更新,请参考上面的str.split()示例。使用pd.concat()连接(联接)原始的pandas.DataFrame并使用drop()方法删除原始的列。
来源:https://blog.csdn.net/qq_18351157/article/details/105506107


猜你喜欢
- 前言一次偶然的想法,想知道为什么在终端输入那些命令行后,就执行了对应的操作,这转化为代码,应该怎么实现呢?既然有了问题,那我们就来解决问题吧
- 1,关闭eslint这里只说vue-cli脚手架的关闭方法,其实很简单,就是把 build/webpack.base.conf.js 配置文
- 上一篇文章讲解了重置 MySQL 的密码,有同学反馈无法程连接到数据库,这是因为 MySQL 安装完成后只支持 localhost 访问,我
- 在pandas中的groupby和在sql语句中的groupby有异曲同工之妙,不过也难怪,毕竟关系数据库中的存放数据的结构也是一张大表罢了
- 在transactional replication, 经常会遇到数据同步延迟的情况。有时候这些延迟是由于在publication中执行了一
- 1.折线图 plt.plot()常用的一些参数:颜色(color):‘c’ 青红(cyan)&
- 本文实例讲述了JavaScript实现弹出DIV层同时页面背景渐变成半透明效果。分享给大家供大家参考,具体如下:<!DOCTYPE h
- 在Python中,我们令一个变量等于另外一个变量时,并不是把值传递给它,而是直接把指向的地址更改了。我们想要查看一个变量在内存中的地址,可以
- 一:安装MySQL-python驱动 pip install mysql二:连接到MySQL服务器的test数据库#!/usr/
- 1.lower()将字符串中的大写字母转换成小写字母语法:str.lower()#举例:str1 = "LiBai is a bo
- 习惯于使用数据库之前都必须创建一个连接池,即使是单线程的应用,只要有多个方法中需用到数据库连接,建立一两个连接的也会考虑先池化他们。连接池的
- 本文实例讲述了php+jQuery实现的 * 导航栏下拉菜单显示效果。分享给大家供大家参考,具体如下:首先看看效果图:1.数据配置文件 db.
- 1.输入命令 mysqld --skip-grant-tables (前提关闭mysql.exe的进程 net stop mys
- 原理:建一个栈,每次碰到一个新标签,就与栈顶的标签配对,如果配对,栈顶的标签就出栈,如果不配对,这个新标签就进栈,最终,栈如果是空的,说明所
- 油猴脚本(Tampermonkey)是一个非常流行的浏览器扩展,它可以运行由广大社区编写的扩展脚本,来实现各式各样的功能,常见的去广告、修改
- 在指定路径下新建一个文件夹:import osdef newfile(path): path=path.strip() path=path.
- 协程协程(co-routine,又称微线程)是一种多方协同的工作方式。当前执行者在某个时刻主动让出(yield)控制流,并记住自身当前的状态
- 我们做登录的时候经常会使用到,验证手机号是否正确、向手机发送验证码倒计时60s的问题,我们改如何解决呢?让我们一起来探讨一下吧。如下图:首先
- python selenium 获取接口数据。selenium没有直接提供查询的函数,但是可以通过webdriver提供的API查询,使用的
- 这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚。给出实例def train(train_loader, mod