为了账号安全,请及时绑定邮箱和手机立即绑定

将 Python DataFrame 转换为字典列表

将 Python DataFrame 转换为字典列表

森林海 2021-11-23 19:26:29
我有一个数据框,想将其转换为字典列表。我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 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-11-23
?
一只名叫tom的猫

TA贡献1906条经验 获得超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 在评论中解释的那样, the_作为占位符变量存在,因为iterrows()返回 (index, Series) 元组,而我们只需要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而不是赋值给,_因为我们实际上将使用索引来“标记”portfolios列表中的字典。


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 441 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信