我正在尝试清理熊猫数据框中的一个名为“ historical_rank”的列。它包含字符串数据。这是内容示例:
historical_rank
... ...
122 1908
123 O'
124
125 1911
126 1912
127 1913 * * * 2010 * * *
128
129 1914
130 1915
131
132
133 1918
134 (First served 1989 to 1999)
... ...
我要保留的数据是第122、125、126、127、129、130和133行中的四位数字。在该系列的其他位置,该数字(历史排名)可能是1、2或三位数。它总是以字符串开头,并且在其后总是有一个空格。我想使用正则表达式保留所需的模式-r'\ d {1,4}(?= \ s)'-并删除整个系列中的所有其他内容。实现此目的的正确代码是什么?谢谢。
答案 0 :(得分:1)
IICU
df['historical_rank_new']=df['historical_rank'].str.extract('(^[\d]{1,4})')
df
答案 1 :(得分:1)
您应该考虑在str.extract
method中使用正则表达式,但要记住,此方法要求正则表达式至少包含一个捕获组。
如果您打算在字符串的开头匹配一位,两位,三位或四位数字,然后再匹配至少一个空格(仅根据您的\d{1,4}(?=\s)
模式判断),您应该尝试
df['historical_rank_clean'] = df['historical_rank'].str.extract('^(\d{1,4})\s', expand=False).fillna('')
请注意模式中的(...)
,parethese组成了一个捕获组,其内容将用于填充新historical_rank_clean
列中的单元格。 .fillna('')
将使用空字符串填充不匹配的条目。
其他一些正则表达式的想法:
r'^(\d{2}(?:\d{2})?)\b'
-在字符串的开头提取两位或四位数的块,后跟单词边界r'^((?:20|19)?\d{2})\b'
-与上述类似,但仅允许以19
或20
开头的年份(如果是四位数的年份)。请参见regex demo
答案 2 :(得分:0)
要改善@wwnde答案,可以使用:
df['historical_rank_new']=df['historical_rank'].str.extract('(^\d{1,4}$)')
这里是repl.it
答案 3 :(得分:0)
作为替代方案,您可以使用str.replace
并将模式与捕获组配合使用,以保留所需的内容并匹配要删除的内容。
^
字符串的开头(
捕获第1组(保留)
\d{1,4}
匹配1-4位数字)
关闭群组\s
匹配空白字符|
或.+
匹配任何字符1次以上在替换项中,使用组1 r'\1'
^(\d{1,4})\s|.+
例如
df.historical_rank = df.historical_rank.str.replace(r"^(\d{1,4})\s|.+", r'\1')