Это должно сделать это:
portfolios = []
for _, account in df.groupby('AccountName'):
portfolio = {stock['StockName']: stock['Allocation']
for _, stock in account.iterrows()}
portfolios.append(portfolio)
Сначала используйте функцию groupby()
, чтобы сгруппировать строки кадра данных по AccountName
.Чтобы получить доступ к отдельным строкам (акциям) для каждой учетной записи, используйте метод iterrows()
.Как пояснил пользователь @ ebb-earl-co в комментариях, _
присутствует в качестве переменной-заполнителя, поскольку iterrows()
возвращает (index, Series
) кортежи, и нам нужен только Series
(сами ряды).Оттуда используйте dict compceptionsion , чтобы создать словарное отображение StockName
-> Allocation
для каждой акции.Наконец, добавьте этот словарь в список portfolios
, чтобы получить ожидаемый результат:
[{'ABC': 0.4, 'ABD': 0.6}, {'EFG': 0.5, 'HIJ': 0.4, 'LMN': 0.1}]
Еще одна вещь: если позже вы решите, что хотите пометить каждый диктовку вportfolios
с именем учетной записи, вы можете сделать это следующим образом:
portfolios = []
for acct_name, account in df.groupby('AccountName'):
portfolio = {stock['StockName']: stock['Allocation']
for _, stock in account.iterrows()}
portfolios.append({acct_name: portfolio})
Это вернет список вложенных диктов следующим образом:
[{'MN001': {'ABC': 0.4, 'ABD': 0.6}},
{'MN002': {'EFG': 0.5, 'HIJ': 0.4, 'LMN': 0.1}}]
Обратите внимание, что в этом случаеЯ использовал переменную acct_name
вместо присвоения _
, потому что мы на самом деле будем использовать индекс для «маркировки» диктов в списке portfolios
.