出现错误后如何在数据框中标记损坏的数据

问题描述 投票:8回答:2

我有一个很大的数据框,其中除其他外还包含(挪威)社会保险号。可以通过特殊算法从该数字中获取出生日期。但是,不时有一个非法的社会保险号潜入数据库,破坏了计算。

我想做的是标记每行有非法社会保险号的行,以及显示错误消息的日志消息。

请考虑以下构造的示例

import pandas as pd
from datetime import date

sample_data = pd.DataFrame({'id' : [1, 2, 3], \
                            'sec_num' : [19790116, 19480631, 19861220]})


# The actual algorithm transforming the sec number is more complicated
# this is just for illustration purposes
def int2date(argdate: int):

    try:
        year = int(argdate / 10000)
        month = int((argdate % 10000) / 100)
        day = int(argdate % 100)
        return date(year, month, day)
    except ValueError:
        raise ValueError("Value:{0} not a legal date.".format(argdate))

我想创建以下输出

   id   sec_num date_of_birth  is_in_error                    error_msg
0   1  19790116    1979-01-16        False  
1   2  19480631          None         True 19480631 is not a legal date         
2   3  19861220    1986-12-20        False 

我已经尝试过

try:
    sample_data['date_of_birth'] = [int2date(sec_num) for \
                   sec_num in sample_data['sec_num']]
    sample_data['is_in_error'] = False
    sample_data['error_msg'] = ''
 except ValueError as e:
    sample_data['is_in_error'] = True
    sample_data['error_msg'] = str(e)

但是这会产生这个

   id   sec_num  is_in_error                         error_msg
0   1  19790116         True  Value:19480631 not a legal date.
1   2  19480631         True  Value:19480631 not a legal date.
2   3  19861220         True  Value:19480631 not a legal date.

我想问题是我在一个操作中分配了date_of_birth列,而在另一操作中分配了错误。我不确定如何模拟地创建和创建is_in_errorerror_msg列。

python pandas error-handling
2个回答
4
投票

发生这种情况是由于您填充数据框的方式。


2
投票

您处于处理大数据的领域。将异常抛出循环通常不是最好的方法,因为它通常会中止循环。与许多其他人一样,您似乎不希望这样做。

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