Python 在数据帧中使用正则表达式-最后5个字符

Python 在数据帧中使用正则表达式-最后5个字符,python,regex,pandas,Python,Regex,Pandas,我想通过以下方式将列类型从OBJECT更改为INT: df['col name'].astype(str).astype(int) df[df["col name"].str.contains("/")] 此方法适用于其他列,但对于这一列,它不起作用,因为有百分之几的行具有无法转换为INT的值,这正是百分之几的行具有如下内容的“分数”列: 1050/1500 应该是: 1050 我使用Regex以以下方式查找这些行: df['col name'].astype(str).astype(i

我想通过以下方式将列类型从OBJECT更改为INT:

df['col name'].astype(str).astype(int)
df[df["col name"].str.contains("/")]
此方法适用于其他列,但对于这一列,它不起作用,因为有百分之几的行具有无法转换为INT的值,这正是百分之几的行具有如下内容的“分数”列:

1050/1500
应该是:

1050
我使用Regex以以下方式查找这些行:

df['col name'].astype(str).astype(int)
df[df["col name"].str.contains("/")]

现在我只需要从这些行中删除5个字符并保存列,但如果不指定要在哪一行中执行,我不知道如何执行

实现最终目标有多种方法

如果性能不是问题,您可以将
apply
与字符串逻辑一起使用:

df['col name']=df['col name'].apply(lambda x:int(str(x).split('/')[0]))
出[30]:
科尔曼
0     1050
1     1020
2     1030
3     1000
4     1000
考虑到最后5个字符,您可以使用类似的逻辑

df['colname']=df['colname']。应用(如果len(x)>5,则lambda x:x[:-5]
出[32]:
科尔曼
0    1050
1    1020
2    1030
3    1000
4    1000
如果您确实想使用正则表达式,可以使用:

df['colname']=df['colname'].replace('(?:\/[0-9]+)','',regex=True)
出[33]:
科尔曼
0    1050
1    1020
2    1030
3    1000
4    1000
如果性能很重要,我们可以创建一个大型版本的dataframe,并测试3种方法的性能:

df=pd.DataFrame(df['colname'].repeat(10000),columns=['colname']))
len(df)
输出[33]
270000
##方法1
%timeit df['colname']=df['colname'].apply(lambda x:int(str(x).split('/')[0]))
每个回路123 ms±1.03 ms(7次运行的平均值±标准偏差,每个10个回路)
###方法2
%timeit df['colname']=df['colname']。应用(如果len(x)>5,则lambda x:x[:-5]
每个回路31.6 ms±280µs(7次运行的平均值±标准偏差,每个10个回路)
##方法3
%timeit df['colname']=df['colname'].replace('(?:\/[0-9]+)','',regex=True)
每个回路57.3 ms±265µs(7次运行的平均值±标准偏差,每个10个回路)

您可以使用
/\d+$
正则表达式删除
/
和字符串末尾的以下数字。因此,首先将数据转换为字符串,然后替换,然后转换为int:

df["col name"] = df["col name"].astype(str).str.replace(r'/\d+$', '').astype(int)

详细信息

  • /
    -a
    /
    字符
  • \d+
    -任意一个或多个数字
  • $
    -字符串结束

尝试
df[“col name”]=df[“col name”].astype(str).str.replace(r'/\d+$,'').astype(int)
它适用于meGreat,我发布为。