Python 嵌套字典排序

问题描述 投票:0回答:1

从多个表中我得到的值的形式。(扇形,股票,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的组合 根据InvestedValue进行排序。

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

我目前解决这些问题的方法是将嵌套的字典扁平化为tupples列表,并在其上运行排序。比如说

要解决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个回答
0
投票

如果你使用pandas,它可以将你的dict转换为一个数据框架。 然后,你可以解除数据框架的堆栈,这将使它成为长格式而不是宽格式。 一旦它是长格式的,你将有任何公司没有参与的部门的空值,你可以用dropna()删除这些,重置索引,并按你所需的列排序。 一旦完成了这些工作,请将您的列重命名为所需的名称,并按照您想要的顺序选择它们。 您可以使用相同的df和groupby sector对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
© www.soinside.com 2019 - 2024. All rights reserved.