【问题标题】:Python Sorting through nested dictionaryPython通过嵌套字典排序
【发布时间】:2020-09-17 05:06:25
【问题描述】:

我从多个表中获取以下形式的值:(Sector, Stock, InvestedValue)。

我正在使用 Python 字典对象来插入这些值,并且在插入期间,如果组合(部门、股票)存在,则将 InvestedValue 添加到现有条目中,否则将新条目添加到字典中。在所有数据插入之后,假设我最终得到了嵌套字典,例如:

stock_dict = {
    "Financial": {"HDFC Bank": 230.25, "Axis Bank": 70.15, "ICICI Bank": 110.45},
    "Automobile": {"Tata Motors": 135.67},
    "Consumer Goods": {"Avenue Supermarket": 190.45, "Godrej Industries": 120.32}
}

如何以排序方式打印此嵌套字典:

  1. 获取根据 InvestedValue 排序的 Sector、Company、InvestedValue 的组合

  2. 获取 Sector 和 sum(InvestedValue) 的组合,即。该行业中每家公司的 InvestedValue 总和再次按总和排序

我目前解决这些问题的方法是将嵌套字典展平为元组列表并在其上运行排序。例如:

解决1:

stock_list = []
for sector in stock_dict:
    for stock in stock_dict[sector]:
        stock_list.append((sector, stock, stock_dict[sector][stock]))
sorted_list = sorted(stock_list, key=lambda stock: stock[2], reverse=True)

解决2:

sector_list = []
for sector in stock_dict:
    sector_list.append((sector,sum(stock_dict[sector].values())))
sorted_sector_list = sorted(sector_list, key=lambda sector: sector[1], reverse=True)

是否有更好的方法,即直接在嵌套字典上排序而不必将其展平到列表中?

【问题讨论】:

    标签: python sorting dictionary nested


    【解决方案1】:

    如果您使用 pandas,它可以将您的 dict 转换为数据框。然后,您可以取消堆叠数据框,使其成为长格式而不是宽格式。一旦它采用长格式,您将拥有公司不参与的任何部门的空值,您可以使用 dropna() 删除这些值,重置索引并按所需列对值进行排序。完成此操作后,将您的列重命名为所需的名称,然后按您想要的顺序选择它们。您可以采用相同的 df 和 groupby 部门并对 InvestedValue 求和。

    import pandas as pd
    stock_dict = {
        "Financial": {"HDFC Bank": 230.25, "Axis Bank": 70.15, "ICICI Bank": 110.45},
        "Automobile": {"Tata Motors": 135.67},
        "Consumer Goods": {"Avenue Supermarket": 190.45, "Godrej Industries": 120.32}
    }
    
    df = pd.DataFrame.from_dict(stock_dict, orient='index')
    df = df.unstack().dropna().reset_index(name='InvestedValue').sort_values(by='InvestedValue', ascending=False)
    
    df.columns = ['Company','Sector','InvestedValue']
    df[['Sector','Company','InvestedValue']]
    

    输出

               Sector             Company  InvestedValue
    0       Financial           HDFC Bank         230.25
    4  Consumer Goods  Avenue Supermarket         190.45
    3      Automobile         Tata Motors         135.67
    5  Consumer Goods   Godrej Industries         120.32
    2       Financial          ICICI Bank         110.45
    1       Financial           Axis Bank          70.15
    

    第二部分

    df.groupby('Sector')['InvestedValue'].sum().reset_index().sort_values(by='InvestedValue', ascending=False)
    

    输出

               Sector  InvestedValue
    2       Financial         410.85
    1  Consumer Goods         310.77
    0      Automobile         135.67
    

    【讨论】:

    • 嗨,克里斯,感谢您的快速回复。我实际上有另一个使用熊猫的程序版本。有了熊猫,我什至不用字典。我只是将所有多个表导入数据框。这个数据框可以有相同的(部门,股票)组合,因为我只是从我的源中加载它,而不是像字典那样进行任何聚合。加载数据框后,我只需要 1 行代码即可满足我的两个要求:
    • 是否有不使用 pandas 的要求?那你为什么不用它呢?
    • 有另一个版本的熊猫,我只是从我的来源加载数据框,而不是像字典那样进行任何聚合。这个数据框可以有相同的(部门,股票)组合。加载数据框后,我只需要 1 行代码即可满足我的两个要求:对于 1: stock_df.groupby(["Sector", "Stock"], as_index=False).aggregate({"Value": "sum" }).sort_values("Value", ascending=False).reset_index(drop=True) 对于 2:stock_df.groupby("Sector", as_index=False).aggregate({"Value": "sum"}).sort_values ("值", ascending=False).reset_index(drop=True)
    • 这个查询的目的是在字典本身中做一些事情。只是为了从初学者转向高级python。抱歉,原始问题中的意图不明确。我已将您的答案标记为正确,因为这确实解决了要求,而且我还学会了如何将字典解压缩到数据框中
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 2015-03-31
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多