使用正则表达式清洁熊猫系列

时间:2020-05-25 20:29:43

标签: python regex pandas data-cleaning

我正在尝试清理熊猫数据框中的一个名为“ 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)'-并删除整个系列中的所有其他内容。实现此目的的正确代码是什么?谢谢。

4 个答案:

答案 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'-与上述类似,但仅允许以1920开头的年份(如果是四位数的年份)。

请参见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|.+

Regex demo

例如

df.historical_rank = df.historical_rank.str.replace(r"^(\d{1,4})\s|.+", r'\1')