pandas 在python中将dict转换为排序的dict

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13062300/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 20:28:16  来源:igfitidea点击:

convert a dict to sorted dict in python

pythonpandassorteddictionary

提问by Code Ninja

I want to convert a dict into sorted dict in python

我想在python中将dict转换为排序的dict

data = pandas.read_csv('D:\myfile.csv')
for colname, dtype in data.dtypes.to_dict().iteritems():
    if dtype == 'object':
        print colname
        count = data[colname].value_counts()
        d = dict((str(k), int(v)) for k, v in count.iteritems())
        f = dict(sorted(d.iteritems(), key=lambda item: item[1], reverse = True)[:5])
        print f

        m ={}
        m["count"]= int(sum(count))    
        m["Top 5"]= f    
        print m    
        k = json.dumps(m)
        print k    
f = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3}

My desired Output is :

我想要的输出是:

f = {'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3}
k = {'count':24, 'top 5':{'Gears of war 3': 6, 'Batman': 5, 'Rocksmith': 5, 'gears of war 3': 4, 'Madden': 3}}

(in the descending order of values and the result should be a dict)

(按值的降序排列,结果应该是一个字典)

回答by K Z

You cannot sort a dictbecause dictionary has no ordering.

您不能对 a 进行排序,dict因为字典没有排序。

Instead, use collections.OrderedDict:

相反,使用collections.OrderedDict

>>> from collections import OrderedDict
>>> d = {'Gears of war 3': 6, 'Batman': 5, 'gears of war 3': 4, 'Rocksmith': 5, 'Madden': 3}

>>> od = OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True))
>>> od
OrderedDict([('Gears of war 3', 6), ('Batman', 5), ('gears of war 3', 4), ('Rocksmith', 5), ('Madden', 3)])

>>> od.keys()
['Gears of war 3', 'Batman', 'gears of war 3', 'Rocksmith', 'Madden']
>>> od.values()
[6, 5, 4, 5, 3]
>>> od['Batman']
5


The "order" you see in an JSON object is not meaningful, as JSON object is unordered[RFC4267].

您在 JSON 对象中看到的“顺序”没有意义,因为 JSON 对象是无序的 [ RFC4267]。

If you want meaningful ordering in your JSON, you need to use a list (that's sorted the way you wanted). Something like this is what you'd want:

如果您想在 JSON 中进行有意义的排序,则需要使用列表(按您想要的方式排序)。像这样的东西是你想要的:

{
  "count": 24,
  "top 5": [
    {"Gears of war 3": 6},
    {"Batman": 5},
    {"Rocksmith": 5},
    {"gears of war 3": 4},
    {"Madden": 3}
  ]
}

Given the same dict d, you can generate a sorted list (which is what you want) by:

给定相同的 dict d,您可以通过以下方式生成排序列表(这是您想要的):

>>> l = sorted(d.items(), key=lambda x:x[1], reverse=True)
>>> l
[('Gears of war 3', 6), ('Batman', 5), ('Rocksmith', 5), ('gears of war 3', 4), ('Madden', 3)]

Now you just pass lto m['top5']and dump it:

现在你只是传递lm['top5']和转储:

m["Top 5"]= l
k = json.dumps(m)