亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于多級標頭將 pandas 數據框轉換為嵌套字典

基于多級標頭將 pandas 數據框轉換為嵌套字典

飲歌長嘯 2023-07-05 16:26:30
我的 csv 文件有一個特定的標題,其中每個字段都包含一個數據庫表名稱和列名稱,并用斜杠分隔。簡單的例子:user/username,user/email,user/name,address/country,address/city我需要將 pandas 數據框轉換為如下所示的字典:dict = {    "user": {        "username": "",        "email": "",        "name": ""    },    "address": {        "country": "",        "city": ""    }}最簡單但效率較低的方法是使用 to_dict(orient='records') 方法將數據幀轉換為字典,但顯然它沒有給出所需的輸出,因此需要進行進一步的處理。在不觸及列名稱的情況下,我得到一個如下所示的字典:dict = {    "user/username": "",    "user/email":"",    "user/name":"",    "address/country":"",    "address/city":"",}當按分隔符分割標頭時,我得到一個多級標頭,但是 to_dict 方法提供了一個以元組作為鍵的字典,因此需要再次進行處理才能獲得所需的輸出:df.columns = df.columns.str.split('/', expand=True)dict = {    ("user","username"): "",    ("user","email"): "",    ("user","name"): "",    ("address","country"): "",    ("address","city"): "",}我還嘗試使用 itertuples() 迭代行,但列名有問題。當我有一個多級標題或當我將其保留為 ,,/,, 字符時,它會用數字(_1、_2、_3...)替換列名稱。所以無論如何,我對于一個相對簡單的任務有一些開銷。當讀取非常大的文件時,這種開銷可能會產生問題。我不是一個普通的 pandas 用戶,所以我想有一個簡單的方法來完成這個任務,但我無法用谷歌搜索出來。
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

使用Index.str.splitwithexpand=True創建MultiIndex列,然后在字典理解中遍歷level=0列并使用DataFrame.to_dictwith?orient=records

df.columns = df.columns.str.split('/', expand=True)

dct = {k: df[k].to_dict('r') for k in df.columns.levels[0]}

例子:


print(df)

? user/username user/email user/name address/country address/city

0? ? ? ? ? ? A1? ? ? ? ?B1? ? ? ? C1? ? ? ? ? ? ? D1? ? ? ? ? ?E1

1? ? ? ? ? ? A2? ? ? ? ?B2? ? ? ? C2? ? ? ? ? ? ? D2? ? ? ? ? ?E2


print(dct)

{

? ? 'address': [

? ? ? ? {'city': 'E1', 'country': 'D1'},

? ? ? ? {'city': 'E2', 'country': 'D2'}

? ? ],

? ? 'user': [

? ? ? ? {'email': 'B1', 'name': 'C1', 'username': 'A1'},

? ? ? ? {'email': 'B2', 'name': 'C2', 'username': 'A2'}

? ? ]

}

編輯:如果數據框中的每一行需要嵌套字典,頂級鍵為user和address:


from collections import defaultdict


def f(df):

? ? df = df.set_axis(

? ? ? ? df.columns.str.split('/', expand=True), 1)


? ? for d in df.to_dict('r'):

? ? ? ? dct = defaultdict(dict)

? ? ? ? for x, y in d:

? ? ? ? ? ? dct[x][y] = d[(x, y)]

? ? ? ? yield dict(dct)


dcts = list(f(df))

結果:


print(dcts)

[

? ? {

? ? ? ? 'user': {'username': 'A1', 'email': 'B1', 'name': 'C1'},

? ? ? ? 'address': {'country': 'D1', 'city': 'E1'}

? ? },

? ? {

? ? ? ? 'user': {'username': 'A2', 'email': 'B2', 'name': 'C2'},

? ? ? ? 'address': {'country': 'D2', 'city': 'E2'}

? ? }

]


查看完整回答
反對 回復 2023-07-05
  • 1 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號