Python,字典汇总列表

时间:2020-07-06 21:09:39

标签: python list dictionary

虽然没有Python知识,但是在SW编程方面有一些其他合理的经验,我偶然发现了以下问题……。在包含非结构化信息的大数据集中,我(由于Stackoverflow)已经可以进入以下数据集(字典列表,针对Stackoverflow上的此问题进行了简化/精简)

data  = [ {'KEY_A': 'A1', 'KEY_B': 'B1', 'RES': 'true'}, 

          {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'true'},
          {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'false'},
          {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'inconclusive'},          

          {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'true'},
          {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'false'}, 

          {'KEY_A': 'A3', 'KEY_B': 'B4', 'RES': 'false'}
         ]

对于即将到来的处理步骤而言,这看起来非常合理。

从逻辑角度讲,KEY_A与KEY_B一起构建了一个“逻辑密钥”(实际上每一行都是确定的度量,其中KEY_A和KEY_B是某些条件,其他条件已从列表中删除,因为不再需要它)分配了1到n(这里n = 3)个结果(真,假,无结论)。

现在的工作是“汇总”该数据,例如对于相同的“逻辑键”,“ RES”应仅减少为一个值,例如第2、3、4行(都包含“ KEY_A”:“ A1”,“ KEY_B”:“ B2”),三个不同的“ RES”值应汇总到 {'KEY_A':'A1','KEY_B':'B2','RES':'false'} 根据“规则”:“最差的人获胜”,其中“假”比“不确定”差于“真” 所以最终汇总的数据应如下所示:

data  = [ {'KEY_A': 'A1', 'KEY_B': 'B1', 'RES': 'true'},
          {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'false'},          
          {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'false'},
          {'KEY_A': 'A3', 'KEY_B': 'B4', 'RES': 'false'}
         ]

在此结果列表中,有一组唯一的KEY_A KEY_B,并且赢得了“真实,不确定和错误”中的“最差结果”。

我能以某种方式想象的潜在解决方案“战略”如下: 获取唯一的KEY_A列表(分别为A1,A2,A3) 根据唯一的KEY_A列表遍历数据 对于每个条目 获得唯一的KEY_B列表(对于A1,它将是B1,B2。对于A2,它将是B3。对于A3,它将是B4 根据唯一的KEY_B列表遍历数据 运用“最糟糕的制胜法则”

但是
a)看起来不太优雅

b)我假设是Python或类似库pandas具有基于规则聚合此类数据的功能(请看一下Pandas手册第1.0.3版,但找不到此类功能)。我在Stackoverflow中发现了聚合的东西,但是在那些示例中,聚合始终是不同条目(例如here)的值的总和或其他数学运算(没有“ worst one wins”之类的逻辑)。 >

c)无论如何,我必须研究如何实现此功能

任何有关如何进行(甚至编码)的建议都受到高度赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

正如您提到的'"123-456789"',这是一种实现方法。关键是pandas在进行字符串比较时,实际上可以执行'false' < 'inconclusive' < 'true'groupby

min

如果您希望进行自定义排序,则需要先将import pandas as pd data = [ {'KEY_A': 'A1', 'KEY_B': 'B1', 'RES': 'true'}, {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'true'}, {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'false'}, {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'inconclusive'}, {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'true'}, {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'false'}, {'KEY_A': 'A3', 'KEY_B': 'B4', 'RES': 'false'} ] df = pd.DataFrame(data) print(df.groupby(['KEY_A', 'KEY_B']).min().reset_index().to_dict(orient='records')) [{'KEY_A': 'A1', 'KEY_B': 'B1', 'RES': 'true'}, {'KEY_A': 'A1', 'KEY_B': 'B2', 'RES': 'false'}, {'KEY_A': 'A2', 'KEY_B': 'B3', 'RES': 'false'}, {'KEY_A': 'A3', 'KEY_B': 'B4', 'RES': 'false'}] 列转换为分类列。您可以在执行此操作时指定所需的顺序。例如:

RES

如果需要其他输出格式,请查看to_dict的选项。

如果您不想使用熊猫,可以使用类似itertools.groupby的方法。