【问题标题】:Dataframe checking if the string ends with a number and remove数据框检查字符串是否以数字结尾并删除
【发布时间】:2022-01-24 17:05:45
【问题描述】:

假设我在数据框 df 中有一个列 foo,它看起来像:

0            abc1
1             def
2           g3sse1
3           f32asd

我不想要最后的数字,如果有的话。

0             abc
1             def
2            g3sse
3           f32asd

像这样。

我能做的最好的就是:

df.foo[df['foo'].str[-1].str.isdigit()] = df['foo'].str[:-1]

这解决了问题,但是......我很好奇是否有更优雅的方式来做到这一点。我想正则表达式不会让它看起来更好,但我很感激任何想法!

【问题讨论】:

  • 如果条目末尾有多个数字会怎样?
  • @RichardKYu 这在这个数据集中不会发生。

标签: python pandas dataframe


【解决方案1】:

由于您的输入仅包含尾随数字,并且在这种情况下您不想使用正则表达式,您还可以使用rstrip 和python 的string 模块:

import string
df['foo_refined'] = df['foo'].str.rstrip(string.digits)

      foo foo_refined
0    abc1         abc
1     def         def
2  g3sse1       g3sse
3  f32asd      f32asd

a = '12a'
>>> a.rstrip(string.digits)
'12a'

b = '12a2'
>>> b.rstrip(string.digits)
'12a'

c = '12a12x'
>>> c.rstrip(string.digits)
'12a12x'

d = '123'
>>> d.rstrip(string.digits)
''

以及对lstrip 的引用,如果在此上下文中使用,它会像预期的那样从开头而不是结尾删除任何数字。

【讨论】:

  • 最好的一个,假设 OP 想要去除所有尾随数字
  • 梦里从来没有想过字符串模块。非常感谢您的解决方案!
【解决方案2】:

您的解决方案很好。另一种选择是:

df['foo_new'] = df['foo'].str.extract('(.*)\d$').fillna(df['foo'])

【讨论】:

  • 哇,好的,正则表达式确实使它看起来比我的解决方案更好。谢谢你的好主意~
  • 不确定您为什么选择“提取和补偿”而不是“删除”,即df[col].str.replace(r"\d*$", "")。无趣。
  • @除了不考虑使用正则表达式的str.replace之外,没有什么特别的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多