【问题标题】:Python coulmns validation using pandas schema使用 pandas 模式的 Python 列验证
【发布时间】:2021-01-15 17:08:39
【问题描述】:

我正在尝试使用 PandasSchema 验证我的 DataFrame 库。我一直在验证某些列,例如:

1.ip_address- 应包含格式为 1.1.1.1 的 ip 地址,或者如果任何其他值应引发错误,则应为 null。 2.initial_date- 格式 yyyy-mm-dd h:m:s 或 mm-dd-yyyy h:m:s 等。 3.customertype 应该是 in['type1','type2','type3'] 其他任何东西都会引发错误。 4.客户满意=是/否或空白 5.customerid 不应超过 5 个字符,例如 cus01,cus02 6.time 应为 %:%: 格式或 h:m:s 格式,否则会引发异常。

from pandas_schema import Column, Schema
def check_string(sr):
    try:
        str(sr)
    except InvalidOperation:
        return False
    return True
def check_datetime(self,dec):
        try:
            datetime.datetime.strptime(dec, self.date_format)
            return True
        except:
            return False
def check_int(num):
    try:
        int(num)
    except ValueError:
        return False
    return True
    

string_validation=[CustomElementValidation(lambda x: check_string(x).str.len()>5 ,'Field Correct')]
int_validation = [CustomElementValidation(lambda i: check_int(i), 'is not integer')]
contain_validation = [CustomElementValidation(lambda y: check_string(y) not in['type1','type2','type3'], 'Filed is correct')]
date_time_validation=[CustomElementValidation(lambda dt: check_datetime(dt).strptime('%m/%d/%Y %H:%M %p'),'is not a date
 time')]
null_validation = [CustomElementValidation(lambda d: d is not np.nan, 'this field cannot be null')]

schema = Schema([
                 Column('CompanyID', string_validation + null_validation),
                 Column('initialdate', date_time_validation),
                 Column('customertype', contain_validation),
                 Column('ip', string_validation),
                 Column('customersatisfied', string_validation)])
errors = schema.validate(combined_df)
errors_index_rows = [e.row for e in errors]
pd.DataFrame({'col':errors}).to_csv('errors.csv')

【问题讨论】:

    标签: python pandas dataframe validation customvalidator


    【解决方案1】:

    我刚刚查看了 PandasShema 的文档,并且大多数(如果不是全部)您正在寻找它的开箱即用功能。看看:

    作为解决您的问题的快速尝试,类似的方法应该可以:

    from pandas_schema.validation import (
        InListValidation
        ,IsDtypeValidation
        ,DateFormatValidation
        ,MatchesPatternValidation
    )
    
    schema = Schema([
        # Match a string of length between 1 and 5
        Column('CompanyID', [MatchesPatternValidation(r".{1,5}")]),
    
        # Match a date-like string of ISO 8601 format (https://www.iso.org/iso-8601-date-and-time-format.html)
        Column('initialdate', [DateFormatValidation("%Y-%m-%d %H:%M:%S")], allow_empty=True),
        
        # Match only strings in the following list
        Column('customertype', [InListValidation(["type1", "type2", "type3"])]),
    
        # Match an IP address RegEx (https://www.oreilly.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html)
        Column('ip', [MatchesPatternValidation(r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}")]),
    
        # Match only strings in the following list    
        Column('customersatisfied', [InListValidation(["yes", "no"])], allow_empty=True)
    ])
    

    【讨论】:

    • 嗨,您能告诉我另一种解决此问题的方法,而无需使用任何像 pandasschema 这样的包。我需要它而不使用任何 3rd 方包。如果它基本上在循环或条件上工作会很好
    • 您的问题表明您正在使用 3rd 方库,如果您有不同的要求,请发布另一个问题。
    • 我想不使用 pandas 架构包。使用简单的函数和条件语句。
    • 这里是我的问题的链接stackoverflow.com/questions/64255867/…
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 2018-02-05
    • 1970-01-01
    • 2013-09-24
    • 2020-03-21
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多