对深层嵌套字典中的特定键进行排序

时间:2018-06-13 08:44:35

标签: python json dictionary ordereddictionary

我有一个深层嵌套的字典:

{u'1009': {u'2017': {u'April': {u'Revenue': 36087,
    u'Total_users': 107,
    u'Unique_users': 79},
   u'August': {u'Revenue': 103458, u'Total_users': 314, u'Unique_users': 208},
   u'December': {u'Revenue': 132834,
    u'Total_users': 440,
    u'Unique_users': 241},
   u'July': {u'Revenue': 98120, u'Total_users': 356, u'Unique_users': 212},
   u'June': {u'Revenue': 88315, u'Total_users': 293, u'Unique_users': 169},
   u'May': {u'Revenue': 114438, u'Total_users': 348, u'Unique_users': 203},
   u'November': {u'Revenue': 114747,
    u'Total_users': 414,
    u'Unique_users': 233},
   u'October': {u'Revenue': 114073, u'Total_users': 339, u'Unique_users': 223},
   u'September': {u'Revenue': 87587,
    u'Total_users': 290,
    u'Unique_users': 190}},
  u'2018': {u'April': {u'Revenue': 4780,
    u'Total_users': 13,
    u'Unique_users': 12},
   u'February': {u'Revenue': 99922, u'Total_users': 354, u'Unique_users': 205},
   u'January': {u'Revenue': 195031, u'Total_users': 429, u'Unique_users': 239},
   u'March': {u'Revenue': 111568, u'Total_users': 359, u'Unique_users': 222}}},
 u'1051': {u'2017': {u'August': {u'Revenue': 11700,
    u'Total_users': 40,
    u'Unique_users': 26},
   u'July': {u'Revenue': 39730, u'Total_users': 132, u'Unique_users': 42},
   u'June': {u'Revenue': 16320, u'Total_users': 54, u'Unique_users': 36},
   u'May': {u'Revenue': 47572, u'Total_users': 160, u'Unique_users': 141},
   u'September': {u'Revenue': 250, u'Total_users': 1, u'Unique_users': 1}}},
 u'1056': {u'2017': {u'August': {u'Revenue': 1426,
    u'Total_users': 6,
    u'Unique_users': 6},
   u'December': {u'Revenue': 380, u'Total_users': 2, u'Unique_users': 2},
   u'July': {u'Revenue': 6220, u'Total_users': 20, u'Unique_users': 11},
   u'June': {u'Revenue': 20370, u'Total_users': 66, u'Unique_users': 35},
   u'May': {u'Revenue': 57566, u'Total_users': 181, u'Unique_users': 127},
   u'November': {u'Revenue': 250, u'Total_users': 1, u'Unique_users': 1},
   u'October': {u'Revenue': 250, u'Total_users': 1, u'Unique_users': 1},
   u'September': {u'Revenue': 1000, u'Total_users': 3, u'Unique_users': 3}},
  u'2018': {u'April': {u'Revenue': 4440,
    u'Total_users': 12,
    u'Unique_users': 5},
   u'February': {u'Revenue': 26149, u'Total_users': 74, u'Unique_users': 26},
   u'January': {u'Revenue': 92050, u'Total_users': 310, u'Unique_users': 204},
   u'March': {u'Revenue': 16548, u'Total_users': 55, u'Unique_users': 33}}},
 u'1103': {u'2017': {u'August': {u'Revenue': 42050,
    u'Total_users': 104,
    u'Unique_users': 52},
   u'December': {u'Revenue': 24319, u'Total_users': 76, u'Unique_users': 48},
   u'July': {u'Revenue': 27160, u'Total_users': 92, u'Unique_users': 40},
   u'June': {u'Revenue': 28470, u'Total_users': 97, u'Unique_users': 45},
   u'May': {u'Revenue': 1550, u'Total_users': 3, u'Unique_users': 3},
   u'November': {u'Revenue': 25290, u'Total_users': 90, u'Unique_users': 43},
   u'October': {u'Revenue': 17840, u'Total_users': 62, u'Unique_users': 42},
   u'September': {u'Revenue': 21800, u'Total_users': 75, u'Unique_users': 44}},
  u'2018': {u'April': {u'Revenue': 17894,
    u'Total_users': 63,
    u'Unique_users': 57},
   u'February': {u'Revenue': 147772,
    u'Total_users': 610,
    u'Unique_users': 553},
   u'January': {u'Revenue': 17549, u'Total_users': 66, u'Unique_users': 42},
   u'March': {u'Revenue': 471022,
    u'Total_users': 1898,
    u'Unique_users': 1557}}}

数据格式为

  

{' mid':{' year':{' month':{Revenue:,,,,,}}}}

有了这个,对于特定年份,请说2017

我需要按照总收入(所有月份的总和)来计算密钥的排序列表。 比如top_5 = ['1259', '403', '1251', '1119', '1009'], bottom_5 = ['1468', '1503', '1387', '509', '1129']

我不确定如何解决这个问题,所以任何进展都会有所帮助。

1 个答案:

答案 0 :(得分:0)

很难说出你想要实现的目标,但如果不采用递归的方式压扁嵌套的dicts,我会将你的字典转换为 pandas dataframe,如下所示:

import pandas as pd

df = pd.DataFrame.from_dict({(i,j,k): your_dict[i][j][k] 
                           for i in your_dict.keys() 
                           for j in your_dict[i].keys()
                           for k in your_dict[i][j].keys()},
                       orient='index')

那么你可以举例:

df.groupby(level=[0,1]).sum().sort_values("Revenue")

中间

生成每月的总和

或者您可以通过以下方式展平指数:

flattened_df = df.reset_index()
flattened_df.rename(columns={'level_0': 'mid', 'level_1': 'year', 'level_2': 'month'})

这样您就可以看到数据发生了什么。