使用python正则表达式用字符串的小数部分替换数据框列值
Posted
技术标签:
【中文标题】使用python正则表达式用字符串的小数部分替换数据框列值【英文标题】:Use python regex to replace dataframe column values with decimal part of string 【发布时间】:2021-12-09 04:17:48 【问题描述】:我有一个数据框,其列 df['gravidityAndParity'] 包含如下字符串值:
0 g4p3
1 g2p0
2 g7p2
3 g2p0
4 g7p6
'g'后面的数字是重力,'p'后面的数字是奇偶性。我正在尝试将此列分为两列:df['gravidity'] 和 df['parity]
所以我追求的输出是:
print(df['gravidity'])
0 4
1 2
2 7
3 2
4 7
print(df['parity])
0 3
1 0
2 2
3 0
4 6
我使用正则表达式定义了一个函数来执行此操作,但该函数无法正常工作。
到目前为止,这是我的代码:
import regex as re
# Function to clean the names
def Split_gravidity_parity(gravidityAndParity):
match_gravidity = re.search('g(\d+)', gravidityAndParity)
if match_gravidity:
df['gravidity']= match_gravidity.group(1)
match_parity = re.search('p(\d+)', gravidityAndParity)
if match_parity:
df['parity']= match_parity.group(1)
将函数应用于列:
df['gravidityAndParity'].apply(Split_gravidity_parity)
print(df['gravidity'])
0 4
1 4
2 4
3 4
4 4
print(df['parity'])
0 3
1 3
2 3
3 3
4 3
该函数似乎部分工作,因为它似乎只应用于“g4p3”列中的第一个值。
对我如何正确实现此正则表达式函数到列中的所有值并将结果输出到两个新列“gravidity”和“parity”有任何帮助吗?
【问题讨论】:
附带问题:你真的需要 PyPi 正则表达式库吗? 【参考方案1】:您可以将内置的re
与Series.str.extract
一起使用:
import pandas as pd
df=pd.DataFrame('gravidityAndParity':['g4p3','g2p0','g7p2','g2p0','g7p6'])
df[['gravity','parity']] = df['gravidityAndParity'].str.extract(r'g(\d+)p(\d+)')
# => >>> df
# gravidityAndParity gravity parity
# 0 g4p3 4 3
# 1 g2p0 2 0
# 2 g7p2 7 2
# 3 g2p0 2 0
# 4 g7p6 7 6
g(\d+)p(\d+)
模式将g
之后的一位或多位数字捕获到第 1 组(“重力”列)并匹配 p
,然后将一位或多位数字捕获到第 2 组(“奇偶校验”列) .
【讨论】:
以上是关于使用python正则表达式用字符串的小数部分替换数据框列值的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:使用正则表达式用超链接替换字符串
请问怎么用R语言正则表达式统计文章的单词数和中文字数,不能用程序包?