Python 基于多级头的数据帧到嵌套字典的转换
我的csv文件有一个特定的标题,其中每个字段都包含一个数据库表名和列名,用斜杠分隔。简单的例子: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": "&
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”键的值作为单个字典,而不是列表。因此,作为示例的结果,是否有两个词典?