微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 类型检查Pandas DataFrames

我想键入检查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方式的类型检查DataFrames?看起来更像the new Python 3.6 static type-checking的东西?

是否有可能在mypy中实现它?

解决方法:

也许不是最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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐