如何在数据帧python中过滤出格式错误的单元格

如何在数据帧python中过滤出格式错误的单元格,python,pandas,dataframe,filtering,Python,Pandas,Dataframe,Filtering,我想写一个函数或使用一个命令来检查ID是否遵循特定的格式,即ID必须是9位长度,第一位数字必须是字母表。如果没有,那么我想过滤掉与该ID号对应的行。例如,我有一个数据帧(称为df): 使用df=df[df['ID'].str.len()==9],我可以过滤掉最后一行以获得 ID status 0 B12345678 graduated 1 C12345678 graduated 2 A12345678 in pr

我想写一个函数或使用一个命令来检查ID是否遵循特定的格式,即ID必须是9位长度,第一位数字必须是字母表。如果没有,那么我想过滤掉与该ID号对应的行。例如,我有一个数据帧(称为df):

使用
df=df[df['ID'].str.len()==9]
,我可以过滤掉最后一行以获得

         ID          status
    0   B12345678   graduated
    1   C12345678   graduated
    2   A12345678   in progress
    3   111111111   unknown
    4   A3B111111   unknown
但是第3行和第4行仍然不是正确的格式,我也需要过滤掉它。这样做的有效方法是什么

我试过了

df = df[df['ID'].isdigit()] 
但我得到了一个错误,它说:“'Series'对象没有属性'isdigit'”

我的数据帧代码是:

   students = [('ID', ['B12345678', 'C12345678',  'A12345678','111111111','A3B111111','A12']),
 ('status', ['graduated',  'graduated','in progress','unknown','unknown','unknown'])
 ]


df = pd.DataFrame.from_items(students)
与相应的正则表达式一起使用:

In [4]: df[df['ID'].str.match(r'[A-Z]\d{8}')]
Out[4]:
          ID       status
0  B12345678    graduated
1  C12345678    graduated
2  A12345678  in progress


如果第一个字母也可以小写

谢谢。如果这些数据流进来,我该怎么做?例如,如何仅检查一行或一个ID元素(即B12345678)?当我试着只检查一个元素时,我不断得到一个错误,它说:“str”对象没有属性“str”
In [4]: df[df['ID'].str.match(r'[A-Z]\d{8}')]
Out[4]:
          ID       status
0  B12345678    graduated
1  C12345678    graduated
2  A12345678  in progress
df[df['ID'].str.match(r'[A-Z]\d{8}', case=False)]