python - 在 pandas DataFrame 中检查 dtype 时的注意事项

标签 python pandas dataframe

指导 this answer 我开始建立管道,用于根据数据类型处理数据帧的列。但是在得到一些意想不到的输出和一些调试之后,我最终得到了测试数据帧和测试数据类型检查:

# Creating test dataframe
test = 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')
test
test.dtypes

# Testing types
types = 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 func
def 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 colored
df_types.style.apply(coloring, axis=None)

输出: enter image description here

bool                  bool
int                  int64
float              float64
compl           complex128
dt          datetime64[ns]
td         timedelta64[ns]
prd              period[D]
intrv    interval[float64]
str                 object
cat               category
obj                 object

enter image description here

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

  1. 这里最奇怪的是 pd.api.types.is_string_dtype 触发 在 category dtype 上。这是为什么?是否应将其视为“预期” 行为?
  2. 为什么 is_string_dtypeis_object_dtype 分别触发 其他?这有点意料之中,因为即使在 .dtypes 中也有两种类型 被标记为object,但如果有人澄清它会更好 一步一步来。

P.s.: 额外的问题——当我认为 pandas 有它的内部测试应该在构建新版本时通过时,我是对的吗(比如测试代码中的 df_types,但不是“红色着色”而是“记录有关错误的信息”) ?

编辑: Pandas 版本 0.24.2

最佳答案

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

这个检查不严格的原因是 pandas 中没有专门的字符串 dtype,而字符串只是用 object dtype 存储的,这真的可以存储任何东西。因此,更严格的检查可能会带来性能开销。

回答您的问题:

  1. 这是 CategoricalDtype.kind 被设置为 'O' 的结果,这是松散检查之一 is_string_dtype做。考虑到 TODO 注释,这在未来可能会发生变化,因此我不会依赖它。

  2. 由于字符串存储为 object dtype,所以 is_object_dtype 在字符串上触发是有意义的,我认为这种行为作为实现是可靠的在不久的将来几乎肯定不会改变。由于依赖 is_string_dtype 中的 dtype.kind,反之亦然,它与上述分类具有相同的警告。

  3. 是的,pandas 有一个测试套件,可以为每个创建的 PR 在各种 CI 服务上自动运行。测试套件包括类似于您正在执行的检查。

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

关于python - 在 pandas DataFrame 中检查 dtype 时的注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56381708/

相关文章:

python - 在 Python Gino 中获取池连接(异步)

python - 如何将 Python 3.x 与 Python(x,y) 一起使用?

python - Pandas :从一列中为另一列中的每个唯一值获取最高值

python - 在每个示例上使用 tensorflow 获得相同的预测

python - 在 pandas 中存在 NaN 的情况下从日期时间列中提取四分之一

python - 如何从同一数据帧中查找另一列中包含唯一值的列值?

python - 关于DP的性能讨论

python - 在 Python 中使用 Selenium 提取特定类的链接

python - 总结 Python Pandas 中两列(双向)的组合计数

python - pandas 行操作仅保留每行最右边的非零值