我在数据帧中有一系列字符串,我想在数字开始后删除字符串中的所有内容。这是一个例子:
sstrings['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']
所以,最后,我希望它是:
sstrings['abc', 'def', 'dab', 'gh']
我想做类似的事情:
df['sstrings'] = df['sstrings'].str.split()
但由于领先的数字并不总是相同,我不确定如何做到这一点。
我看到了this,但这似乎不适用于一个系列。
有没有办法在不循环播放系列并使用re.split
的情况下执行此操作?
答案 0 :(得分:3)
您可以使用正则表达式。演示:
>>> import re
>>> s = ['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']
>>> ss = [re.match(r'[^\d]+', x).group(0) for x in s]
>>> ss
['abc', 'def', 'dab', 'gh']
说明:
\d
匹配任何数字
[^\d]
匹配任何不是数字的东西
[^\d]+
匹配一个或多个非数字的序列。
可以找到re.match
的文档here。如果字符串开头的零个或多个字符与我们的模式MatchObject
匹配,它将返回group
(我们从中提取匹配的字符串[^\d]+
)。 re.match
已应用于原始列表x
中的所有s
并具有列表推导。
答案 1 :(得分:0)
如果每个字符串的最后部分仅由数字组成,您可以使用:
>>> lst = ['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']
>>> map(lambda txt: txt.rstrip("0123456789"), lst)
['abc', 'def', 'dab', 'gh']
或使用列表理解:
>>> [txt.rstrip("0123456789") for txt in lst]
['abc', 'def', 'dab', 'gh']