Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式清洁熊猫系列_Python_Regex_Pandas_Data Cleaning - Fatal编程技术网

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

Python 使用正则表达式清洁熊猫系列,python,regex,pandas,data-cleaning,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 serve

我正在尝试清理熊猫数据框架中名为“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行中的四位数字。在序列的其他地方,该数字(历史排名)可以是一位、两位或三位数字。它总是以字符串开头,后面总是有空格。我想使用正则表达式保留所需的模式--r'\d{1,4}(?=\s)--并删除整个系列中的所有其他模式。实现这一点的正确代码是什么?多谢各位

IICU

df['historical_rank_new']=df['historical_rank'].str.extract('(^[\d]{1,4})')
df

要改进@wwnde答案,您可以使用:

df['historical_rank_new']=df['historical_rank'].str.extract('(^\d{1,4}$)')

下面是关于

您应该考虑使用您的正则表达式,记住此方法要求正则表达式至少包含一个捕获组

如果您计划在字符串的开头匹配一个、两个、三个或四个数字,并且后跟至少一个空格(仅根据
\d{1,4}(?=\s)
模式判断),您应该尝试

df['historical_rank_clean'] = df['historical_rank'].str.extract('^(\d{1,4})\s', expand=False).fillna('')
注意模式中的
(…)
,Parethes构成一个捕获组,其内容将用于填充新
历史排名清洁
列中的单元格
.fillna(“”)
将使用空字符串填充不匹配的条目

其他一些正则表达式的想法:

  • r'^(\d{2}(?:\d{2})\b'
    -在字符串开头提取两位或四位的块,并在其后加上单词边界
  • r'^((?:20 | 19)?\d{2})\b'
    -与上述类似,但仅允许以
    19
    20
    开始的年份,如果这些年份是四位数的年份

查看

作为替代,您可以使用
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')

查看
pd.Series.str.extract
函数。您可以将所述日期值分配到新的DataFrame列中,然后删除现有列。一年怎么可能是个位数?也许您想提取字符串开头的两个或四个数字,然后加上空格?@Ed_in_NY,如果样本数据中有四年数字开头,您能否在其中包括其他场景?如果您只想保留第122、125、126、127、129、130和133行中的日期,您能否不使用
r'(1908)|(1911)|(1912)|(1913)|(1915)|(1918)“
结合@S3DEV建议?历史排名不是一年,尽管它可能与我提供的样本中的情况类似。数据都是曾经担任过美国参议员的人。到目前为止,已有1984名参议员。例如,第一届国会的参议员都有一到两位数的历史排名。只需稍加修改这个解决方案提供了最好的结果。谢谢。