将Python数据帧转换为字典列表

2024-04-29 04:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,想把它转换成字典列表。我使用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 

所需输出:

^{pr2}$

我尝试过研究类似的主题,并使用了Dataframe.to_dict()函数。我期待着完成这件事。非常感谢你的帮助!在


Tags: csv数据列表read字典abcallocationabd
2条回答
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()

结果应该是:

^{pr2}$

这应该做到:

portfolios = []
for _, account in df.groupby('AccountName'):
    portfolio = {stock['StockName']: stock['Allocation'] 
              for _, stock in account.iterrows()}
    portfolios.append(portfolio)

首先使用^{}函数按AccountName对数据帧的行进行分组。要访问每个帐户的单独行(股票),可以使用^{}方法。正如user@ebb earl在评论中解释的那样,_作为占位符变量存在,因为iterrows()返回(index,^{})元组,而我们只需要Series(行本身)。在此基础上,使用dict comprehension为每个股票创建一个字典映射StockName->;Allocation。最后,将该字典追加到portfolios的列表中,得到预期的输出:

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

还有一件事:如果您稍后决定用帐户名来标记portfolios中的每个dict,可以这样做:

^{pr2}$

这将返回嵌套dict的列表,如下所示:

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

注意,在本例中,我使用了变量acct_name,而不是赋值给_,因为我们实际上将使用索引来“标记”列表中的dict。在

相关问题 更多 >