将Python DataFrame转换成字典列表

时间:2019-03-01 22:40:43

标签: python pandas dataframe dictionary

我有一个数据框,并希望将其转换为词典列表。我使用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 :(得分:3)

这应该做到:

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()返回(索引,Series)元组,而我们只需要{ {1}}(行本身)。在此处,使用dict comprehension为每个股票创建字典映射Series-> 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,因为我们实际上将使用索引来“标记” _列表中的字典。 / p>

答案 1 :(得分:3)

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'}]