使用正则表达式在熊猫数据框中查找格式不正确的数据?

时间:2020-10-15 01:41:48

标签: python pandas dataframe

所以我有一个熊猫数据框,其中的列名为“ 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)

任何帮助都将不胜感激,我是正则表达式的新手,而且已经坚持了几个小时。谢谢。

2 个答案:

答案 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