嗨,我正在嘗試使用 python 將資料幀轉換為字典。資料框類似于:
data_quim = {'Type':[1,2,3],'BCN':['X',np.nan,np.nan],'MAD':[np.nan,'X',np.nan],'MAT':['X',np.nan,'X']}
df = pd.DataFrame(data_quim)
df
Type BCN MAD MAT
0 1 X NaN X
1 2 NaN X NaN
2 3 NaN NaN X
我想用這種形式得到一本字典:
{1:['BCN','MAT],
2:['MAD],
3:['MAT]}
我嘗試使用 to_dict() 函式,首先將“型別”設定為索引,但無法完全獲得我想要的結果。有什么想法嗎?
uj5u.com熱心網友回復:
你可以使用:
(df.set_index('Type').stack()
.reset_index(1)
['level_1'].groupby(level=0)
.apply(list)
.to_dict()
)
輸出:
{1: ['BCN', 'MAT'], 2: ['MAD'], 3: ['MAT']}
或者,使用apply:
(df.set_index('Type')
.apply(lambda s: list(s.dropna().index), axis=1)
.to_dict()
)
uj5u.com熱心網友回復:
我真的很喜歡@mozway 針對這個特定問題的第二個答案,但apply有時不是最快的。由于 Pandas 非常靈活,您也可以使用pd.melt它來實作這一點,這是將寬資料轉換為窄資料并依靠groupby. 如果您需要在將其放入串列之前執行更多條件/處理的操作(如果您有“X”、“Y”、“NaN”,并且想要用“X”與'Y'):
df.melt(id_vars='Type')\
.dropna()\
.groupby('Type')\
.agg({'variable': list})\
.to_dict()['variable']
或者,如果您出于某種原因想盡快擺脫熊貓:
{
row[0]: [
label
for label, indicator in zip(df.columns[1:], row[1:])
if indicator == 'X'
]
for row in df.values
}
總體而言,這是將原始寬表映射到每個“X”的鍵值對,然后通過鍵將所有值減少到串列中的好問題。由于您的行已經按鍵分組,我真的很喜歡@mozway 的第二個建議。我的第二個建議是一種在 Pandas 之外執行此操作的方法,如果您需要為每一行使用流迭代器,它也可以很好地作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325872.html
上一篇:將資料表轉換為R中的資料框
