Python 使用正则表达式清洁熊猫系列
我正在尝试清理熊猫数据框架中名为“historical_rank”的列。它包含字符串数据。以下是内容示例: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
... ...
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+次
在替换中,使用组1r'\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名参议员。例如,第一届国会的参议员都有一到两位数的历史排名。只需稍加修改这个解决方案提供了最好的结果。谢谢。