Конвертировать Python DataFrame в список словарей - PullRequest
0 голосов
/ 02 марта 2019

У меня есть датафрейм, и я хочу преобразовать его в список словарей.Я использую read_csv() для создания этого кадра данных.Кадр данных выглядит следующим образом:

             AccountName AccountType  StockName Allocation
          0  MN001       #1           ABC       0.4
          1  MN001       #1           ABD       0.6
          2  MN002       #2           EFG       0.5
          3  MN002       #2           HIJ       0.4
          4  MN002       #2           LMN       0.1 

Желаемый результат:

   [{'ABC':0.4, 'ABD':0.6}, {'EFG':0.5, 'HIJ':0.4,'LMN':0.1}]

Я пытался исследовать похожие темы и использовал функцию Dataframe.to_dict().Я с нетерпением жду, чтобы сделать это.Большое спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 02 марта 2019
import pandas as pd 
import numpy as np 

d = np.array([['MN001','#1','ABC', 0.4],
                ['MN001','#1','ABD', 0.6],
                ['MN002', '#2', 'EFG', 0.5],
                ['MN002', '#2', 'HIJ', 0.4],
                ['MN002', '#2', 'LMN', 0.1]])  
df = pd.DataFrame(data=d, columns = ['AccountName','AccountType','StockName', 'Allocation'])

by_account_df = df.groupby('AccountName').apply(lambda x : dict(zip(x['StockName'],x['Allocation']))).reset_index(name='dic'))
by_account_lst = by_account_df['dic'].values.tolist()

И результат должен быть:

print(by_account_lst)
[{'ABC': '0.4', 'ABD': '0.6'}, {'EFG': '0.5', 'HIJ': '0.4', 'LMN': '0.1'}]
0 голосов
/ 02 марта 2019

Это должно сделать это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...