Python Сортировка по вложенному словарю - PullRequest
0 голосов
/ 29 мая 2020

Из нескольких таблиц я получаю значения формы: (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. Получить комбинацию Sector, Company, InvestedValue, отсортированные на основе InvestedValue

  2. Получить комбинацию Sector, sum (InvestedValue) ie. сумма 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)

ЕСТЬ ли лучший подход, т.е. сортировка непосредственно во вложенном словаре без необходимости добавить его в список?

1 Ответ

0 голосов
/ 29 мая 2020

Если вы используете 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

2-я часть

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...