检查大熊猫数据框行相对于其他行的异常情况?

时间:2019-01-21 22:10:25

标签: python pandas

我有一个数据框,其中包含有关产品及其属性集合的信息。每种产品的描述如下:

df = 
   product prop1 prop2 prop3
0        A     a     b     c
1        B    aa    bb     c
2        C     a     b     c
3        D     a    bb     c
4        E    aa     b     c
5        F     a    bb    cc
6        G    aa     b     c
7        H     a     b     c

我正在尝试寻找一种方法来调查任何特定产品的属性值组合与其他产品相比的主要差异。那就是我不仅要查看每个属性相对于该列中的其他值是否具有不常见的值,还要结合使用属性和值的组合来查看特定的组合是否不常见。

我当时想过的幼稚方法是首先找到我所关注产品的(属性,值)对的所有组合,然后扫描数据框以查看什么是不常见的组合。但是,任何产品的(属性,值)对的组合数量为(2 ^ N-1),其中N是属性数量。.因此,这不适用于较大的N值。

例如,上面的产品D的prop1,prop2和prop3的值相对通用...但是prop1 + prop2(a + bb)很少见,而prop1 + prop2 + prop3是产品D独有的组合, (a + bb + c)。

有人会建议一种更好的方法来解决此问题,而不是我的方法不够好就天真吗?在此先感谢您,我们非常感谢您提供一般性建议。

1 个答案:

答案 0 :(得分:0)

如果您要寻找具有独特属性组合的产品,显然您需要做一些更复杂的事情。考虑到必须考虑属性的每种组合,我不确定是否可以避免这种复杂性爆炸。例如,对于10个属性,实际上有40个2项对的不同组合,以及1023个属性的唯一组合。

但是,如果要将产品的 all 组合唯一的产品归类为异常产品,则此问题变得很简单。

使用属性的组合作为键,创建一个哈希图/字典,并以值的形式出现该组合。例如(以下代码有效,但具有很高的概念性,需要针对您的数据框进行优化和调整):

productA = (1, "Pan", 24.99)
productB = (1, "Pan", 24.99)
productC = (1, "Pan", 24.99)
productD = (2, "Pan", 24.99)
productE = (2, "Pan", 24.99)
productF = (2, "Stove", 24.99)
productG = (1, "Stove", 78.99)

products = [productA, productB, productC, productD, productE, productF, productG]

combination_dict = dict()
for product in products:
    if product in combination_dict:
        combination_dict[product] += 1
    else:
        combination_dict[product] = 1

#Get all of the "outliers"
outliers = []
uniqueness_threshold = 2
for product in products:
    if combination_dict[product] < uniqueness_threshold:
        outliers.append(product)

print(outliers)

哪些印刷品:

[(2, 'Stove', 24.99), (1, 'Stove', 78.99)]