为了账号安全,请及时绑定邮箱和手机立即绑定

基于多级标头将 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 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信