Python 字典中的和值小于某个值
我有下面的字典,正试图用它们做一个饼图,但我只想包括前5个(它们已经在这里按值排序),然后将其他的加起来,归入Python 字典中的和值小于某个值,python,sorting,dictionary,aggregate,Python,Sorting,Dictionary,Aggregate,我有下面的字典,正试图用它们做一个饼图,但我只想包括前5个(它们已经在这里按值排序),然后将其他的加起来,归入其他类别,即替换出版,时尚,食物等,只有一个另一个将它们加在一起。坚持如何做到这一点,所以将感谢任何帮助 {'Games': 715067930.8599964, 'Design': 705237125.089998, 'Technology': 648570433.7599969, 'Film & Video': 379559714.56000066, 'Music':
其他
类别,即替换出版
,时尚
,食物
等,只有一个另一个
将它们加在一起。坚持如何做到这一点,所以将感谢任何帮助
{'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()
您可以在使用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}
基于@jpp的思想,但使用: 输出
{'Technology': 648570433.7599969, 'Design': 705237125.089998, 'Other': 658334549.8999994, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066, 'Music': 191227757.8699999}
{'Technology': 648570433.7599969, 'Design': 705237125.089998, 'Other': 658334549.8999995, 'Music': 191227757.8699999, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066}
或者如果你喜欢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.8999994, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066, 'Music': 191227757.8699999}
{'Technology': 648570433.7599969, 'Design': 705237125.089998, 'Other': 658334549.8999995, 'Music': 191227757.8699999, 'Games': 715067930.8599964, 'Film & Video': 379559714.56000066}
第二个方案(使用numpy)的复杂性为O(n),其中n
是d
的键、值对的数量