如何提取数据框列中reg表达式不匹配的地方?

问题描述 投票:0回答:1

我有两个数据框。

OrderedDict([('page1',     name       dob
          0   John  07-20200
          1  Lilly   05-1999
          2  James   02-2002), ('page2',      name       dob
          0   Chris   07-2020
          1  Robert   05-1999
          2    barb  02-20022)])

我想对两个数据框中的每个日期运行reg表达式 如果它们都匹配,我想继续我的程序 如果没有匹配,我想打印一条消息,显示df名称,索引和日期的情况,就像这样。

INVALID DATE: Page1: index 0: dob: 02-20200
INVALID DATE: Page2: index 2: dob: 02-20022

我到了这一步

    date_pattern = r'(?<!\d)((?:0?[1-9]|1[0-2])-(?:19|20)\d{2})(?!\d)'
    for df_name, df in employee_dict.items():
    x = df[df.dob.str.contains(date_pattern, regex=True)]
    print(x)

匹配的地方用表格格式打印,但我想在不匹配的地方用单独的打印语句打印。

任何想法?

regex python-3.x dataframe for-loop if-statement
1个回答
1
投票

你可以遍历数据框的所有行,如果条目不符合你的模式,你可以生成你选择的消息。

for df_name, df in employee_dict.items():       # Iterate over your DFs
  for index, row in df.iterrows():              # Iterate over DF rows 
    if not re.search(date_pattern, row['dob']): # If the dob column value has no match
      print("INVALID DATE: {}: index {}: dob: {}".format(df_name, index,row['dob']))  # Print error message

如果你的 dfpd.DataFrame({'dob': ['05-2020','4-2020','07-1999','2-2001','1-20202020','112-2020']}),结果将是

INVALID DATE: page1: index 4: dob: 1-20202020
INVALID DATE: page1: index 5: dob: 112-2020

0
投票

你要找的是 Series.str.match.

基本上,你需要提取 dob 系列,我想这就是你要做的事情。df['dob'],并做 result = df['dob'].str.match(date_pattern). 其结果将是一系列的 TrueFalse 值,对应于各自的 df['dob'] 价值。

© www.soinside.com 2019 - 2024. All rights reserved.