获取嵌套Python字典中特定值的计数

时间:2016-08-15 15:47:19

标签: python dictionary nested

我有一个巨大的嵌套字典(6k记录),我需要根据我的第二个字典中的两个值进行排序和计数。

item_dict = {
    64762.0: {
        'In Sheet': 'No',
        'Paid': Y,
        'Region': "AMER'",
        'Matrix Position': 'Check'
    },
    130301.0: {
        'Paid': N,
        'Region': "AMER'",
        'Matrix Position': 'Calculate'
    },
    13111.0: {
        'In Sheet': 'Yes',
        'Region': "EMEA'",
        'Matrix Position': 'Check'
    },
    130321.0: {
        'Matrix Position': 'Enhance',
        'In Sheet': 'No',
        'Paid': Y,
        'Region': "JP'"
    }
}

所以,我需要获得区域和矩阵位置之间的计数。所以,我最终会说:

Amer and Calculate: 1
EMEA and Calculate: 0
EMEA and Check= 1
AMER and Check= 1
EMEA and Enhance= 0
JP and Check=0 

等等。问题是,完整的数据集有5个区域,有4个潜在的矩阵位置。最好的方法是使用for循环搜索每个可能的组合,然后将其添加到自己的列表中吗?

AmerCalculate=[]
for row in item_dict:
    if item_dict[row]['Region'] == "AMER'" and item_dict[row]['Matrix Position'] == "Calculate":
        AmerCalculate.append(row)

然后,为了得到长度,做len(AmerCalculate)?有没有更优雅的方式这样做,所以我不必手动输入所有20种组合?

3 个答案:

答案 0 :(得分:0)

AmerCalculate={}
Regions = ["AMER", "EMEA", "JP"]
Positions = ["Calculate", "Check"]
for row in item_dict():
    for region in regions:
        for pos in Positions:
            if (item_dict[row]['Region']==region) and (item_dict[row][MatrixPosition] == pos:
    AmerCalculate(str(region)+ ' and ' +str(pos) + ":")+=1

这将返回一个格式如下的字典:{"region + matrixposition:": total} {Amer and Calculate: 1, EMEA and calculate: 1}

你需要退还钥匙吗?或者只是每个地区每个职位的总数?

答案 1 :(得分:0)

使用另一个字典将数据集耦合在一起,从那里您可以生成您正在寻找的输出:

def dict_counter(dict_arg):
    d = {'AMER':[],'EMEA':[],'JP':[]}  # Regions as keys.

    for int_key in dict_arg:
        sub_dict = dict_arg[int_key]
        for key, value in sub_dict.items():
            if value in d:
                d[value].append(sub_dict['Matrix Position'])
    return d

示例输出:

>>> item_dict= {12.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Enhance'},1232.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Check'}, 64762.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Check'}, 130301.0: {'Paid': 'N', 'Region': "AMER",  'Matrix Position': 'Calculate'}, 13111.0: {'In Sheet': 'Yes', 'Region': "EMEA",  'Matrix Position': 'Check'}, 130321.0: {'Matrix Position': 'Enhance','In Sheet': 'No', 'Paid': 'Y', 'Region': "JP"}}
>>> print dict_counter(item_dict)
{'JP': ['Enhance'], 'AMER': ['Check', 'Calculate'], 'EMEA': ['Check']}

我们现在有基础来生成您正在寻找的报告。我们可以使用Counter来计算所有位置实例。以下是我们如何检查list映射值中的计数的示例。

from collections import Counter

d = dict_counter(item_dict)
for k, v in d.items():
    for i, j in Counter(v).items():
        print k,'and',i,'=',j

>>> JP and Enhance = 1
>>> AMER and Enhance = 1
>>> AMER and Check = 2
>>> AMER and Calculate = 1
>>> EMEA and Check = 1

答案 2 :(得分:0)

使用纯Python对您来说至关重要吗?我想,如果你只想这样做一次,你就可以在不考虑表现或美感的情况下做到这一点,或者你想知道一些新的东西。

关于pandas库哪些可以快速优雅地解决这个问题而没有丑陋的循环?它允许以您希望的方式对数据进行分组并对其进行操作。例如,此代码

data_frame.groupby(['Region', 'Matrix Position'])['Matrix Position'].count()

在不做任何循环的情况下,将为您提供您想要的东西,而不是快速方便的子程序

Region  Matrix Position
AMER'   Calculate          1
        Check              1
EMEA'   Check              1
JP'     Enhance            1

它可以帮助您继续处理/准备数据,因为它具有很多数据处理和分析能力。

还有一个示例:以下代码将使用AMER'区域和Check矩阵位置计算行数

from pandas import DataFrame

data_frame = DataFrame(item_dict).transpose()
filtered_data = data_frame[(data_frame['Region'] == "AMER'")
                           & (data_frame['Matrix Position'] == 'Check')]
result = len(filtered_data.index)