Python:用reg的输出替换所有列

2024-04-23 15:55:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据集中,我有这样一个特性(称为Size):

import pandas as pd


dit={"Size" : ["0","0","5mm","12-15","3-10"] }
dt = pd.DataFrame(data=dit)

此功能指定一个范围内的大小(包括最小值和最大值)或一个特定的数字。你知道吗

现在,我想用每个范围的最大值替换这些值。你知道吗

所以,在我的例子中,输出应该是

dit={"Size" : ["0","0","5mm","15mm","10mm"] }

这就是我尝试过的:

import re
dt = re.split("-",dt.loc[:,"Size"])

但是,它抱怨:

TypeError: expected string or bytes-like object

这是有意义的,因为dt.loc[:," Size (in mm)"]的类型是:

pandas.core.series.Series

我的问题是,如何在没有循环的情况下简单地更新此列?


Tags: 数据import功能redataframepandasdatasize
3条回答

你可以用

import pandas as pd
import re

dit={"Size" : ["0","0","5mm","12-15","3-10"] }
dt = pd.DataFrame(data=dit)
rx = r'(\d+)(?:mm)?-(\d+)(?:mm)?'
dt['Size']=dt['Size'].apply(lambda x: re.sub(rx, lambda z: str(max(int(z.group(1)), int(z.group(2)))) + "mm", x))

输出:

>>> dt
   Size
0     0
1     0
2   5mm
3  15mm
4  10mm

正则表达式匹配

  • (\d+)-第1组:一个或多个数字
  • (?:mm)?-可选的mm字符序列
  • --连字符
  • (\d+)-第2组:一个或多个数字
  • (?:mm)?--可选的mm字符序列。你知道吗

str(max(int(z.group(1)), int(z.group(2)))) + "mm"保留两组中数字的最大值,并在末尾附加mm。你知道吗

这个表达式可能返回所需的输出,我假设mm不是所需的:

import pandas as pd

dit={"Size" : ["0","0","5mm","12-15mm","3mm-10mm"] }
dt = pd.DataFrame(data=dit)

dt['max_size']=dt["Size"].str.replace(r"^.*?(\d+)\D*$",r"\1")

print(dt)

输出

       Size max_size
0         0        0
1         0        0
2       5mm        5
3   12-15mm       15
4  3mm-10mm       10

使用简单的掩码Series.apply函数:

In [172]: m = df['Size'].str.contains('-?\d+mm$')                                                                                               

In [173]: df.loc[m, 'Size'] = df.loc[m, 'Size'].apply(lambda x: x.split('-')[-1])                                                              

In [174]: df                                                                                                                                   
Out[174]: 
   Size
0     0
1     0
2   5mm
3  15mm
4  10mm

'-?\d+mm$'模式详细信息:

  • -?-匹配可选的-字符
  • \d+mm$-匹配一个或多个数字\d,后跟字符串$末尾的mm后缀

相关问题 更多 >