验证数据并在数据无效时显示错误消息

2024-05-16 06:30:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,它有超过200万条记录。它没有任何标题。 第一个字段是日期,第二个字段是时间,第三和第四个字段是纬度。 现在,我的任务是基于regex验证每个记录,如果数据无效,我需要打印一条错误消息。对于某些字段,记录可以包含空记录。我不知道如何检查每一行,如果有任何错误,如何打印该记录的错误消息

2018-01-01  00:15:49    43.24116    -79.85282   Lockout 134 43.39425    -79.98044   H23 9   F109    CCG     00:48:16
2018-01-01  00:16:47    43.76756    -79.41196   Flatbed Tow 435 43.77409    -79.49313   C23 10  FB88    CCG     00:18:19
2018-01-01  00:18:53    43.26671    -79.96222   Tow 172 43.2412 -79.85274   H23 11  F109    CCG     02:42:04
2018-01-01  00:22:59    43.8088942  -79.2698542 No service  35  43.78196    -79.2351    C2  50001   WL5 CLUB_AUTO       00:23:04
2018-01-01  00:25:39    43.57866    -79.63927   Tow 304 43.59991    -79.67094   C950    14  F157    CCG     02:46:21
2018-01-01  00:26:27    43.72097    -79.47553   Lockout 152 43.81375    -79.36767   C950    15  F124    CCG P2  00:50:35
2018-01-01  00:26:56    43.785702   -79.729198  Jump Start/Battery Test 55  43.68537    -79.80871   C28 50003   FB6 CCG     00:52:26
2018-01-01  00:28:08    43.79901    -79.42031   Flatbed Tow 67  43.94571    -79.44134   C950    50004   F124    CLUB_AUTO       00:35:10
2018-01-01  00:33:26    43.67615    -79.7707    Tow 84  0   0   C28 19  FB6 CCG P2  00:54:30

下面是我的代码

import pandas as pd
import re
#reading CSV
df = pd.read_csv("E:\ERS_DATA_HOOSIER.txt", delimiter='\t', dtype=str, header=None, error_bad_lines=False)
x= len(df.index)
print(x)
#check date
df[0]= df[0].str.split('(\d\d\d\d-\d\d-\d\d)', expand = True)
#check Time
df[1]= df[1].str.extract('(\d\d:d\d:\d\d)', expand = True)
Check Long
df[2]= df[2].str.extract('(\d\d.\d\d\d\d*)',expand= True)
#check Lat
df[3]= df[3].str.extract('(\d\d.\d\d\d\d*)',expand= True)

有人能提出有效的方法吗


Tags: csvtrue消息dfcheck错误记录extract
1条回答
网友
1楼 · 发布于 2024-05-16 06:30:10

您可以这样做,一次一列:

df = pd.read_csv('data.txt', delimiter='\t', dtype=str, header=None, error_bad_lines=False)
def check_regex(df, col, rgx):
    return df[~df[col].str.contains(rgx)]
check_regex(df, 0, '\d{4}-\d{2}-\d{2}')

编辑:

您也可以这样做,其中rgx在rgxs中的顺序是要检查的列的顺序:

rgxs = ['\d{4}-\d{2}-\d{2}', '\d{2}:\d{2}:\d{2}', ...]

def check_rgx(col):
    return col.str.contains(rgxs[col.name])
mask = df.apply(check_rgx)
mask.apply(all, axis=1)

相关问题 更多 >