我有一个巨大的嵌套字典(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种组合?
答案 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)