所以我有一个熊猫数据框,其中的列名为“ year”,其中包含很多年。列如下所示:
0 1885
1 1828
2 1913
3 1906
4 1963
5 1906
6 1906
7 1903
8 1969
9 1958
10 1695
11 1889
12 1906
13 1884
14 1890
15 1873
16 1908
17 1974
18 1961
19 1963
20 1973
21 2005
22 1970
23 1852
24 1906
我正在尝试使用match()查找格式不正确的年份。日期应为4位数字。第一个字符应为1或2。第二个字符应为0、7、8或9。最后两个字符应为数字。应该选择1695年。我还试图使用一个函数将年份转换为字符串。还有另一列称为“名称”,我正尝试打印与年份在同一行的名称(索引10)。 到目前为止,这是我的代码:
y = re.match('^[3-9][1-6]*\d', df['year']).group()
def string(y):
return str(y)
string(y)
任何帮助都将不胜感激,我是正则表达式的新手,而且已经坚持了几个小时。谢谢。
答案 0 :(得分:2)
您可以在此处修改正则表达式,并使用熊猫.str.match
系列方法来应用它:
# bad_date_mask is a boolean array,
# where True means we have a "good" date, and False is a "bad" date
bad_date_mask = df["year"].astype(str).str.match("^[12][0789]\d\d$")
print(df.loc[bad_date_mask])
year
10 1695
regex细目分类:
^
:字符串必须以该符号后面的字符开头[12]
:匹配字符1或2 [0789]
:匹配字符0、7、8、9 \d{2}
:匹配任意两个连续的数字$
:该字符串必须现在结束。如果继续,则不匹配。答案 1 :(得分:0)
我的建议是1)分解它,2)除非需要,否则不要使用正则表达式。让我们创建一个布尔掩码,然后查找满足所有条件的行:
# Dates should have 4 digits
cond1 = (df.year.str.len() == 4)
# The first character should be a 1 or 2
cond2 = df.year.str.get(0).isin(("1","2"))
# The second a 0, 7, 8 or 9
cond3 = df.year.str.get(1).isin(("0","7","8","9"))
# The last two characters should be digits
cond4 = df.year.str[-2:].str.isnumeric()
joint_cond = cond1 & cond2 & cond3 & cond4
solution = df[joint_cond]
建议的条件不会返回值1695