【问题标题】:Type-checking Pandas DataFrames类型检查 Pandas 数据帧
【发布时间】:2018-03-06 20:56:35
【问题描述】:

我想对 Pandas DataFrames 进行类型检查,即我想指定 DataFrame 必须具有哪些列标签以及其中存储了哪种数据类型 (dtype)。一个粗略的实现(受 question 启发)会像这样工作:

from collections import namedtuple
Col = namedtuple('Col', 'label, type')

def dataframe_check(*specification):
    def check_accepts(f):
        assert len(specification) <= f.__code__.co_argcount
        def new_f(*args, **kwds):
            for (df, specs) in zip(args, specification):
                spec_columns = [spec.label for spec in specs]
                assert (df.columns == spec_columns).all(), \
                  'Columns dont match specs {}'.format(spec_columns)

                spec_dtypes = [spec.type for spec in specs]
                assert (df.dtypes == spec_dtypes).all(), \
                  'Dtypes dont match specs {}'.format(spec_dtypes)
            return f(*args, **kwds)
        new_f.__name__ = f.__name__
        return new_f
    return check_accepts

我不介意检查功能的复杂性,但它增加了很多样板代码。

@dataframe_check([Col('a', int), Col('b', int)],    #  df1
                 [Col('a', int), Col('b', float)],) #  df2
def f(df1, df2):
    return df1 + df2

f(df, df)

有没有更 Pythonic 的方式来检查数据帧?看起来更像the new Python 3.6 static type-checking 的东西?

可以在mypy中实现吗?

【问题讨论】:

    标签: python python-3.x pandas typechecking


    【解决方案1】:

    也许不是最 Pythonic 的方式,但为您的规范使用 dict 可能会奏效(将键作为列名,将值作为 data types):

    import pandas as pd
    
    df = pd.DataFrame(columns=['col1', 'col2'])
    df['col1'] = df['col1'].astype('int')
    df['col2'] = df['col2'].astype('str')
    
    cols_dtypes_req = {'col1':'int', 'col2':'object'} #'str' dtype is 'object' in pandas
    
    def check_df(dataframe, specs):
        for colname in specs:
            if colname not in dataframe:
                return 'Column missing.'
            elif dataframe[colname].dtype != specs[colname]:
                return 'Data type incorrect.'
        for dfcol in dataframe:
            if dfcol not in specs:
                return 'Unexpected dataframe column.'
        return 'Dataframe meets specifications.'
    
    print(check_df(df, cols_dtypes_req))
    

    【讨论】:

    • 如果您使用OrderedDict 实现它,您还可以检查列的顺序。
    【解决方案2】:

    试试pandera

    为寻求正确性的科学家、工程师和分析师提供的数据验证库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2020-01-09
      • 2023-04-10
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多