Сортировка по определенному ключу в глубоко вложенном словаре - PullRequest
0 голосов
/ 13 июня 2018

У меня есть глубоко вложенный словарь как таковой:

{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': {Доход: ,,,,,}}}}

С этим, для определенного года, скажем 2017

Мне нужно вычислить отсортированный список ключей поих общий доход (сумма всех месяцев).как top_5 = ['1259', '403', '1251', '1119', '1009'], bottom_5 = ['1468', '1503', '1387', '509', '1129'].

Я не уверен, как это сделать, поэтому любой прогресс будет полезен.

1 Ответ

0 голосов
/ 13 июня 2018

Трудно сказать, чего вы хотите достичь, но, не прибегая к рекурсивному выравниванию вложенных диктов, я бы преобразовал ваш словарь в панд 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'})

Это позволит вам увидеть, что происходит с данными.

...