关于ZAKER 融媒体解决方案 合作 加入

在熊猫 DataFrame 中检查 dtype 时的警告

CocoaChina 10-23

this答案的指导下 , 我开始根据其 dtype 建立用于处理数据框列的管道 . 但是在得到一些意外的输出和一些调试之后 , 我最终得到了测试数据帧和测试 dtype 检查:

# Creating test dataframetest = pd.DataFrame ( {'bool' : [ False, True ] , 'int': [ -1,2 ] ,'float': [ -2.5, 3.4 ] , 'compl':np.array ( [ 1-1j, 5 ] ) , 'dt' : [ pd.Timestamp ( '2013-01-02' ) , pd.Timestamp ( '2016-10-20' ) ] , 'td' : [ pd.Timestamp ( '2012-03-02' ) - pd.Timestamp ( '2016-10-20' ) , pd.Timestamp ( '2010-07-12' ) - pd.Timestamp ( '2000-11-10' ) ] , 'prd' : [ pd.Period ( '2002-03','D' ) , pd.Period ( '2012-02-01', 'D' ) ] , 'intrv':pd.arrays.IntervalArray ( [ pd.Interval ( 0, 0.1 ) , pd.Interval ( 1, 5 ) ] ) , 'str' : [ 's1', 's2' ] , 'cat' : [ 1, -1 ] , 'obj' : [ [ 1,2,3 ] , [ 5435,35,-52,14 ] ] } ) test [ 'cat' ] = test [ 'cat' ] .astype ( 'category' ) testtest.dtypes# Testing typestypes = list ( test.columns ) df_types = pd.DataFrame ( np.zeros ( ( len ( types ) ,len ( types ) ) , dtype=bool ) , index = [ 'is_'+el for el in types ] , columns = types ) for col in test.columns: df_types.at [ 'is_bool', col ] = pd.api.types.is_bool_dtype ( test [ col ] ) df_types.at [ 'is_int' , col ] = pd.api.types.is_integer_dtype ( test [ col ] ) df_types.at [ 'is_float',col ] = pd.api.types.is_float_dtype ( test [ col ] ) df_types.at [ 'is_compl',col ] = pd.api.types.is_complex_dtype ( test [ col ] ) df_types.at [ 'is_dt' , col ] = pd.api.types.is_datetime64_dtype ( test [ col ] ) df_types.at [ 'is_td' , col ] = pd.api.types.is_timedelta64_dtype ( test [ col ] ) df_types.at [ 'is_prd' , col ] = pd.api.types.is_period_dtype ( test [ col ] ) df_types.at [ 'is_intrv',col ] = pd.api.types.is_interval_dtype ( test [ col ] ) df_types.at [ 'is_str' , col ] = pd.api.types.is_string_dtype ( test [ col ] ) df_types.at [ 'is_cat' , col ] = pd.api.types.is_categorical_dtype ( test [ col ] ) df_types.at [ 'is_obj' , col ] = pd.api.types.is_object_dtype ( test [ col ] ) # Styling funcdef coloring ( df ) : clr_g = 'color : green' clr_r = 'color : red' mask = ~np.logical_xor ( df.values, np.eye ( df.shape [ 0 ] , dtype=bool ) ) # OUTPUT return pd.DataFrame ( np.where ( mask, clr_g, clr_r ) , index = df.index, columns = df.columns ) # OUTPUT coloreddf_types.style.apply ( coloring, axis=None )

OUTPUT:

bool boolint int64float float64compl complex128dt datetime64 [ ns ] td timedelta64 [ ns ] prd period [ D ] intrv interval [ float64 ] str objectcat categoryobj object

几乎一切都很好 , 但是此测试代码产生两个问题:

> 这里最奇怪的是触发了 pd.api.types.is_string_dtype

在类别 dtype 上 . 这是为什么?是否应将其视为 " 预期 "

行为?

> 为什么在每个对象上都会触发 is_string_dtype 和 is_object_dtype

其他?这是预料之中的 , 因为即使在 .dtypes 中 , 两种类型

被标记为对象 , 但是如果有人澄清它会更好

一步步 .

附:奖金问题 - 我以为熊猫在构建新版本时应该通过其内部测试是正确的吗 ( 例如测试代码中的 df_types, 而不是用 " 红色涂成 " 而不是 " 记录有关错误的信息 " ) ?

编辑:熊猫版本 0.24.2.

这归结为 is_string_dtype 是一个相当宽松的检查 , 其中the implementation甚至有一个 TODO 注释使它更加严格 , 链接到Issue #15585.

此检查不严格的原因是 , 在熊猫中没有专用的字符串 dtype, 而是仅将字符串与对象 dtype 存储在一起 , 该对象实际上可以存储任何内容 . 这样 , 更严格的检查可能会引入性能开销 .

要回答您的问题:

> 这是由于 CategoricalDtype.kind 设置为’ O ’的结果 , 这是 is_string_dtype 宽松检查之一 . 鉴于待办事项说明 , 这种情况将来可能会改变 , 所以这不是我要依靠的 .

> 由于字符串以对象 dtype 的形式存储 , 因此在字符串上触发 is_object_dtype 是有意义的 , 并且我认为这种行为是可靠的 , 因为在不久的将来几乎肯定不会改变实现 . 相反 , 由于 is_string_dtype 中对 dtype.kind 的依赖 , 它具有与上述分类法相同的警告 .

> 是的 ,pandas 有一个测试套件 , 它将针对所创建的每个 PR 在各种 CI 服务上自动运行 . 测试套件包括与您正在执行的检查类似的检查 .

要添加的一个切线相关的注释:有一个名为fletcher的库 , 该库使用 Apache Arrow 以与熊猫兼容的方式实现本机字符串类型 . 它仍在开发中 , 目前可能不支持 pandas 所做的所有字符串操作 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 熊猫

觉得文章不错,微信扫描分享好友

扫码分享