在Pandas中Assert列数据类型

xbp102n0  于 2023-02-02  发布在  其他
关注(0)|答案(3)|浏览(154)

我试图找到一种更好的方法来AssertPython/Pandas中给定 Dataframe 的列数据类型。
例如:

import pandas as pd
t = pd.DataFrame({'a':[1,2,3], 'b':[2,6,0.75], 'c':['foo','bar','beer']})

我想Assert数据框中的特定列是数值型的。下面是我所拥有的:

numeric_cols = ['a', 'b']  # These will be given
assert [x in ['int64','float'] for x in [t[y].dtype for y in numeric_cols]]

最后一行Assert并不像是一条巨蟒。也许是的,我只是把它塞进了一行难以阅读的语句中。有没有更好的方法呢?我想写这样的语句:

assert t[numeric_cols].dtype.isnumeric()

但我好像找不到这样的东西。

rnmwe5a2

rnmwe5a21#

可以使用ptypes.is_numeric_dtype标识数字列,使用ptypes.is_string_dtype标识字符串类型的列,使用ptypes.is_datetime64_any_dtype标识datetime64列:

import pandas as pd
import pandas.api.types as ptypes

t = pd.DataFrame({'a':[1,2,3], 'b':[2,6,0.75], 'c':['foo','bar','beer'],
              'd':pd.date_range('2000-1-1', periods=3)})
cols_to_check = ['a', 'b']

assert all(ptypes.is_numeric_dtype(t[col]) for col in cols_to_check)
# True
assert ptypes.is_string_dtype(t['c'])
# True
assert ptypes.is_datetime64_any_dtype(t['d'])
# True

pandas.api.types模块(我将其别名为ptypes)同时具有is_datetime64_any_dtypeis_datetime64_dtype函数,区别在于它们如何处理类似于时区的数组:

In [239]: ptypes.is_datetime64_any_dtype(pd.DatetimeIndex([1, 2, 3], tz="US/Eastern"))
Out[239]: True

In [240]: ptypes.is_datetime64_dtype(pd.DatetimeIndex([1, 2, 3], tz="US/Eastern"))
Out[240]: False
gdx19jrr

gdx19jrr2#

你能做到的

import numpy as np
numeric_dtypes = [np.dtype('int64'), np.dtype('float64')]
# or whatever types you want

assert t[numeric_cols].apply(lambda c: c.dtype).isin(numeric_dtypes).all()
rta7y2nd

rta7y2nd3#

示例如何简单地执行python的isinstance检查列的panda数据类型,其中列是numpy datetime:

isinstance(dfe.dt_column_name.dtype, type(np.dtype('datetime64')))

注意:dtype可以作为第二个参数对照列表/元组进行检查。
如果您对检查列与行之间的数据类型一致性感兴趣,那么使用apply的@伊利应答可能是更好的选择

相关问题