猿问

基于多级标头将 pandas 数据框转换为嵌套字典

我的 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 用户,所以我想有一个简单的方法来完成这个任务,但我无法用谷歌搜索出来。


饮歌长啸
浏览 180回答 1
1回答

jeck猫

使用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/city0            A1         B1        C1              D1           E11            A2         B2        C2              D2           E2print(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 defaultdictdef 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'}    }]
随时随地看视频慕课网APP

相关分类

Python
我要回答