сумма значений в словаре меньше определенного значения - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть следующий словарь, и я пытаюсь сделать из них круговую диаграмму, но я хочу включить только первые 5 (они уже отсортированы по значению здесь), а затем объединить остальные вместе в категорию Other, т.е. заменитьPublishing, Fashion, Food и т. Д. С одним Other, которые суммируют их все вместе.Застрял в том, как это сделать, поэтому буду признателен за любую помощь!

{'Games': 715067930.8599964,
 'Design': 705237125.089998,
 'Technology': 648570433.7599969,
 'Film & Video': 379559714.56000066,
 'Music': 191227757.8699999,
 'Publishing': 130763828.65999977,
 'Fashion': 125678824.47999984,
 'Food': 122781563.58000016,
 'Art': 89078801.8599998,
 'Comics': 70600202.99999984,
 'Theater': 42662109.69999992,
 'Photography': 37709926.38000007,
 'Crafts': 13953818.35000002,
 'Dance': 12908120.519999994,
 'Journalism': 12197353.370000007}

В данный момент моя круговая диаграмма действительно переполнена этим кодом

groupbycategorypledge = df.groupby('main_category')['usd_pledged_real'].sum().sort_values(ascending=False)
plt.figure(figsize=(20, 10))
pie = groupbycategorypledge.plot(kind='pie', startangle=90, radius=0.7, title='Amount Pledged by Main category',autopct='%1.1f%%',labeldistance=1.2)
plt.legend(loc=(1.05,0.75))
plt.ylabel('')

, поэтому у меня есть

dict = groupbycategorypledge.sort_values(ascending=False).to_dict()

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Основываясь на идее @jpp, но используя кучу :

import heapq

d = {'Games': 715067930.8599964,
     'Design': 705237125.089998,
     'Technology': 648570433.7599969,
     'Film & Video': 379559714.56000066,
     'Music': 191227757.8699999,
     'Publishing': 130763828.65999977,
     'Fashion': 125678824.47999984,
     'Food': 122781563.58000016,
     'Art': 89078801.8599998,
     'Comics': 70600202.99999984,
     'Theater': 42662109.69999992,
     'Photography': 37709926.38000007,
     'Crafts': 13953818.35000002,
     'Dance': 12908120.519999994,
     'Journalism': 12197353.370000007}

top_5 = set(heapq.nlargest(5, d, key=d.get))

groups = {}
for category, pledge in d.items():
    new_category = category if category in top_5 else 'Other'
    groups.setdefault(new_category, []).append(pledge)

result = {k: sum(v) for k, v in groups.items()}
print(result)

Вывод

{'Technology': 648570433.7599969, 'Design': 705237125.089998, 'Other': 658334549.8999994, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066, 'Music': 191227757.8699999}

Или если выfancy numpy:

import numpy as np

d = {'Games': 715067930.8599964,
     'Design': 705237125.089998,
     'Technology': 648570433.7599969,
     'Film & Video': 379559714.56000066,
     'Music': 191227757.8699999,
     'Publishing': 130763828.65999977,
     'Fashion': 125678824.47999984,
     'Food': 122781563.58000016,
     'Art': 89078801.8599998,
     'Comics': 70600202.99999984,
     'Theater': 42662109.69999992,
     'Photography': 37709926.38000007,
     'Crafts': 13953818.35000002,
     'Dance': 12908120.519999994,
     'Journalism': 12197353.370000007}

categories, pledge_values = map(np.array, zip(*d.items()))
partition = np.argpartition(pledge_values, -5)
top_5 = set(categories[partition][-5:])

groups = {}
for category, pledge in d.items():
    new_category = category if category in top_5 else 'Other'
    groups.setdefault(new_category, []).append(pledge)

result = {k: sum(v) for k, v in groups.items()}
print(result)

Выход

{'Technology': 648570433.7599969, 'Design': 705237125.089998, 'Other': 658334549.8999995, 'Music': 191227757.8699999, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066}

Сложность второго предложения (с использованием numpy) составляет O (n) , гдеn - это номер ключа, пары значений d.

0 голосов
/ 08 декабря 2018

Вы можете манипулировать своим словарем до , используя Pandas:

from operator import itemgetter

# sort by value descending
items_sorted = sorted(d.items(), key=itemgetter(1), reverse=True)

# calculate sum of others
others = ('Other', sum(map(itemgetter(1), items_sorted[5:])))

# construct dictionary
d = dict([*items_sorted[:5], others])

print(d)

{'Games': 715067930.8599964,
 'Design': 705237125.089998,
 'Technology': 648570433.7599969,
 'Film & Video': 379559714.56000066,
 'Music': 191227757.8699999,
 'Other': 658334549.8999995}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...