检查嵌套分区中的行具有相同的值

时间:2018-02-21 10:02:13

标签: python sql tableau

我有一张带有两个ID的表,我需要检查一下特定的ID1和ID2,所有产品都是相同且相同数量的产品。

例如,在下表中,我有10001有123和234,并且缺少一行123,其中有产品2,

对于20002,345和456都有产品3和4,但是,最后一个产品有所不同。我需要在我的数据中找到这样的案例。

ID1     ID2     Product
10001   123     Product 1
10001   234     Product 1
10001   234     Product 2
20002   345     Product 3
20002   345     Product 4
20002   345     Product 5
20002   456     Product 3
20002   456     Product 4
20002   456     Product 6

完美的情景将会是正确的。

ID1     ID2     Product
10001   123     Product 1
10001   123     Product 2
10001   234     Product 1
10001   234     Product 2
20002   345     Product 3
20002   345     Product 4
20002   345     Product 5
20002   456     Product 3
20002   456     Product 4
20002   456     Product 5

基本上我需要找到我的数据中的所有案例,在特定ID1中,所有ID2都没有一致的产品,一致的产品我的意思是所有ID2都应该在ID1中具有相同的产品。

有关在第一张表中查找案例的方法的任何建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

想象一下,您已将数据加载到dict中,并且产品列表是一个集合(这可以帮助您保证产品不会因id1,id2而重复):

data = {
    10001: {
        123: set([1]),
        234: set([1,2])
    },
    20002: {
        345: set([3,4,6]),
        456: set([3,4,6])
    }
}

然后,您可以通过在集合上使用“^”运算符来检查id2的两个值是否具有相同的项目。检查https://docs.python.org/3/library/stdtypes.html#set。例如:

a = data[10001][123]
b = data[10001][234]
c = a ^ b # len(c) will be >0 !!

'^'计算两个集合之间的对称差异,因此当且仅当两个集合相等时,它才会返回空集。

因此,您可以迭代给定id1的所有id2键,并使用消息中断一次“^”并且前一个没有零len。例如:

for id1 in data:
    last_seen = None
    for id2 in data[id1]:
        actual = data[id1][id2]
        if last_seen != None and len(last_seen ^ actual) != 0:
                print('Items for id1 {} are not equal'.format(id1))
                break
        last_seen = actual

这假设您的csv文件没有必要订购,因此您需要将其加载到dict中...如果您的文件是按ID排序的,那么您可以读取文件并立即完成工作,当然,我“我相信你可以适应这一点。