2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
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()
結(jié)果應(yīng)該是:
print(by_account_lst)
[{'ABC': '0.4', 'ABD': '0.6'}, {'EFG': '0.5', 'HIJ': '0.4', 'LMN': '0.1'}]

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
這應(yīng)該這樣做:
portfolios = []
for _, account in df.groupby('AccountName'):
portfolio = {stock['StockName']: stock['Allocation']
for _, stock in account.iterrows()}
portfolios.append(portfolio)
首先使用該groupby()函數(shù)按 對(duì)數(shù)據(jù)幀的行進(jìn)行分組AccountName。要訪問每個(gè)帳戶的各個(gè)行(股票),請(qǐng)使用該iterrows()方法。正如用戶@ebb-earl-co 在評(píng)論中解釋的那樣, the_作為占位符變量存在,因?yàn)閕terrows()返回 (index, Series) 元組,而我們只需要Series(行本身)。從那里,使用字典理解為每個(gè)股票創(chuàng)建字典映射StockName-> Allocation。最后,將該字典附加到 的列表中portfolios,從而得到預(yù)期的輸出:
[{'ABC': 0.4, 'ABD': 0.6}, {'EFG': 0.5, 'HIJ': 0.4, 'LMN': 0.1}]
還有一件事:如果您稍后決定要portfolios使用帳戶名稱標(biāo)記每個(gè)字典,您可以這樣做:
portfolios = []
for acct_name, account in df.groupby('AccountName'):
portfolio = {stock['StockName']: stock['Allocation']
for _, stock in account.iterrows()}
portfolios.append({acct_name: portfolio})
這將返回一個(gè)嵌套的字典列表,如下所示:
[{'MN001': {'ABC': 0.4, 'ABD': 0.6}},
{'MN002': {'EFG': 0.5, 'HIJ': 0.4, 'LMN': 0.1}}]
請(qǐng)注意,在這種情況下,我使用了變量acct_name而不是賦值給,_因?yàn)槲覀儗?shí)際上將使用索引來“標(biāo)記”portfolios列表中的字典。
添加回答
舉報(bào)