在Pandas中断言列数据类型

nfm*_*ure 9 python assert dataframe pandas

我正在尝试找到一种更好的方法来断言给定数据帧的Python/Pandas中的列数据类型.

例如:

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

我想声明数据框中的特定列是数字.这就是我所拥有的:

numeric_cols = ['a', 'b']  # These will be given
assert [x in ['int64','float'] for x in [t[y].dtype for y in numeric_cols]]
Run Code Online (Sandbox Code Playgroud)

最后一个断言行不会感觉非常pythonic.也许是这样,我只是在一条难以理解的线上塞满了它.有没有更好的办法?我想写一些类似的东西:

assert t[numeric_cols].dtype.isnumeric()
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到类似的东西.

unu*_*tbu 12

您可以使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • @famargar:您可以使用“ptypes.is_datetime64_any_dtype”。往上看。(我通过仔细阅读“dir(ptypes)”发现了这一点。) (2认同)

ely*_*ely 6

你可以这样做

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()
Run Code Online (Sandbox Code Playgroud)