我有這個資料框:
COL0 COL1 COL2 COL3
----------------------------
A A1 A11 A111
A A1 A11 A112
A A1 A12 A113
A A1 A12 A114
A A2 A13 A115
A A2 A13 A116
A A2 A14 A117
A A2 A14 A118
我想從中獲得一個像下面這樣的字典。如果我只是將 to_dict() 方法應用于原始資料幀,則格式不是我想要的。
{
'A':{
'A1':{
'A11':['A111', 'A112'],
'A12':['A113', 'A114']
},
'A2':{
'A13':['A115', 'A116'],
'A13':['A117', 'A118']
}
}
}
PS:生成上述資料框的代碼段:
df = pd.DataFrame(
{
'COL0': ['A']*8,
'COL1': ['A1']*4 ['A2']*4,
'COL2': ['A11']*2 ['A12']*2 ['A12']*2 ['A13']*2,
'COL3': [f'A11{i 1}' for i in range(8)]
})
編輯:
TypeError Traceback (最近一次呼叫最后一次) in 1 {a: {k: f.groupby('COL2')['COL3'].apply(list).to_dict() 2 for k, f in g.groupby('COL1 ')} ----> 3 for a, g in df.groupby('COL0')}
in (.0) 1 {a: {k: f.groupby('COL2')['COL3'].apply(list).to_dict() 2 for k, f in g.groupby('COL1')} - ---> df.groupby('COL0')} 中的 a、g 為 3
in (.0) 1 {a: {k: f.groupby('COL2')['COL3'].apply(list).to_dict() ----> 2 for k, f in g.groupby(' COL1')} 3 for a, g in df.groupby('COL0')}
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in apply(self, func, *args, **kwargs) 219 ) 220 def apply(self, func, * args, **kwargs): --> 221 return super().apply(func, *args, **kwargs) 222 223 @doc(_agg_template, examples=_agg_examples_doc, klass="Series")
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py in apply(self, func, *args, **kwargs) 865 def apply(self, func, *args, **kwargs): 866 --> 867 func = self._is_builtin_func(func) 868 869 # 這是必需的,所以我們不會嘗試包裝字串。如果我們可以
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\base.py in _is_builtin_func(self, arg) 342 否則回傳 arg 343 """ --> 344 return self._builtin_table.get(引數,引數)345 346
型別錯誤:不可散列型別:“串列”
編輯2:
TypeError Traceback (last last call last) in 1 out = {} ----> 2 for keys, v in df.groupby(list(df.columns[:-1]))[df.columns[-1]] : 3 d = out # 在根目錄重啟 4 val = v.to_list() 5 for k in keys:
TypeError:“串列”物件不可呼叫
uj5u.com熱心網友回復:
遍歷行并收集鍵值對;dict.setdefault如果鍵尚不存在,用于設定默認值:
out = {}
for w,x,y,z in df.to_numpy():
out.setdefault(w, {}).setdefault(x, {}).setdefault(y, []).append(z)
帶有pd.groupby嵌套的 dict 理解:
out = {a: {k: f.groupby('COL2')['COL3'].apply(list).to_dict()
for k, f in g.groupby('COL1')}
for a, g in df.groupby('COL0')}
輸出:
{'A': {'A1': {'A11': ['A111', 'A112'], 'A12': ['A113', 'A114']},
'A2': {'A13': ['A115', 'A116'], 'A14': ['A117', 'A118']}}}
uj5u.com熱心網友回復:
這是一種適用于任意數量列的方法。
它使用 firstgroupby來設定除最后一列之外的所有組。
然后它沿著樹向下,更改對父級的參考,直到它到達最后一個鍵。
out = {}
for keys, v in df.groupby(list(df.columns[:-1]))[df.columns[-1]]:
d = out # restart at root
val = v.to_list()
for k in keys:
if k not in d:
d[k] = {} # create child if missing
parent = d
d = d[k] # go down in nested level
parent[k] = val # we reached the bottom, set the value
輸出:
{'A': {'A1': {'A11': ['A111', 'A112'],
'A12': ['A113', 'A114']},
'A2': {'A13': ['A115', 'A116'],
'A14': ['A117', 'A118']},
},
}
進一步嵌套字典的示例:
from itertools import product
df = (pd.DataFrame(product('AB', '12', '123', '1', '12'))
.add_prefix('COL').cumsum(1)
)
# COL0 COL1 COL2 COL3 COL4
# 0 A A1 A11 A111 A1111
# 1 A A1 A11 A111 A1112
# 2 A A1 A12 A121 A1211
# 3 A A1 A12 A121 A1212
# 4 A A1 A13 A131 A1311
# ...
# 23 B B2 B23 B231 B2312
輸出:
{'A': {'A1': {'A11': {'A111': ['A1111', 'A1112']},
'A12': {'A121': ['A1211', 'A1212']},
'A13': {'A131': ['A1311', 'A1312']}},
'A2': {'A21': {'A211': ['A2111', 'A2112']},
'A22': {'A221': ['A2211', 'A2212']},
'A23': {'A231': ['A2311', 'A2312']}}},
'B': {'B1': {'B11': {'B111': ['B1111', 'B1112']},
'B12': {'B121': ['B1211', 'B1212']},
'B13': {'B131': ['B1311', 'B1312']}},
'B2': {'B21': {'B211': ['B2111', 'B2112']},
'B22': {'B221': ['B2211', 'B2212']},
'B23': {'B231': ['B2311', 'B2312']}}}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410018.html
標籤:
