Python 基于多级头的数据帧到嵌套字典的转换

Python 基于多级头的数据帧到嵌套字典的转换,python,pandas,dataframe,csv,Python,Pandas,Dataframe,Csv,我的csv文件有一个特定的标题,其中每个字段都包含一个数据库表名和列名,用斜杠分隔。简单的例子: user/username,user/email,user/name,address/country,address/city 我需要将pandas数据框转换为如下所示的字典: dict = { "user": { "username": "", "email": "&

我的csv文件有一个特定的标题,其中每个字段都包含一个数据库表名和列名,用斜杠分隔。简单的例子:

user/username,user/email,user/name,address/country,address/city
我需要将pandas数据框转换为如下所示的字典:

dict = {
    "user": {
        "username": "",
        "email": "",
        "name": ""
    },
    "address": {
        "country": "",
        "city": ""
    }
}
dict = {
    "user/username": "",
    "user/email":"",
    "user/name":"",
    "address/country":"",
    "address/city":"",
}
最简单但效率不高的方法是使用to_dict(orient='records')方法将数据帧转换为字典,但显然它没有给出所需的输出,因此需要进行进一步的处理。在不涉及列名的情况下,我得到了一个如下所示的词典:

dict = {
    "user": {
        "username": "",
        "email": "",
        "name": ""
    },
    "address": {
        "country": "",
        "city": ""
    }
}
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的用户,所以我想有一个简单的方法来完成这项任务,但我不能用谷歌搜索出来。

expand=True
一起使用创建
多索引
列,然后在dict comprehension中遍历
level=0
列,并与
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'}
    }
]

作品非常感谢。我也很好奇,为了以后的需要,是否有办法将每一行转换为字典。因此,相同的输出只是将“address”和“user”键的值作为单个字典,而不是列表。因此,作为示例的结果,是否有两个词典?