如何测试两个大熊猫分类系列是否仅在分类标签上有所不同

时间:2018-10-29 17:17:34

标签: python pandas categorical-data

假设我有两个绝对的pandas.Series,如下所示:

> series_1 = pandas.Categorical(
    ["A", "B", "C", "A", "C"],
    categories=["A", "B", "C"]
)

> series_2 = pandas.Categorical(
    [1, 2, 3, 1, 3],
    categories=[1, 3, 2]
)

因此,两个系列的信息内容完全相同,但仅在类别标记方式上有所不同。我的目标是非常快速地进行测试,因为我有一个包含数百个此类列的数据框。

到目前为止,我所做的是使用pandas.crosstab计算一个列联表,并检查它是否是对角矩阵(使用np.diag(cont_table).sum() == cont_table.sum(),这不是完美的)。

我可以简单地将标签转换为整数,并始终使用首次出现的顺序来保证将相应的标签分配给相同的整数,但是我觉得这是一项基本任务,熊猫肯定已经有了某种方法这样。

因此,问题是:是否有一种快速,简单的方法,只需调用几次pandas方法即可?


编辑:

更改为另一个示例,该示例更清楚地说明了任务的难度,因为某些答案适用于上一个示例,但不能解决一般问题。请注意,我通常不能相信两个系列中的类别将按照相应标签的相同顺序正确配对。

this gist中,有一个代码生成此问题的随机实例以测试最终解决方案。代码很简单:

  1. 生成两个具有相同结构但标签不同的numpy数组
  2. 标签创建两个系列并调用.astype('category')方法。

通常会生成类别不按顺序排列的情况。

2 个答案:

答案 0 :(得分:0)

好吧,将我的头撞到文档上一会儿之后,事实证明我可以这样做:

import pandas as pd

def compare_categorical_series():
    values_1, *_ = pd.factorize(feature_1)
    values_2, *_ = pd.factorize(feature_2)
    return np.all(values_1 == values_2)

factorize函数将每个条目转换为整数值,并使用相同的整数表示相等。当然,这还不够,还需要始终以相同的顺序执行此操作,而与实际标签无关。

尽管这种行为在熊猫文档中没有未记录,但经过大量测试,看来这是行为。似乎按标签在系列中出现的顺序分配了整数,这足以保证此应用程序所需的行为。

但是由于未记录这种行为,因此将来可能会发生变化,因此最好有测试用例来检测行为的可能变化。

答案 1 :(得分:-1)

如果您确信类别的顺序相同(如本例所示),则可以执行以下操作:

series_match = (series_1 == series_2).all()
// True for this example