如何将数据框的两列分组并将其他列转换为以列 header 为键的字典
How to groupby two columns of a dataframe and convert other columns into dict with column header as key
数据框:
id id_2 salary title allowance name
0420 13.28 100000 director No Tom
0420 13.28 70000 developer Yes Sam
0110 13.12 120000 director No Dave
0110 13.12 75000 developer Yes shaun
Groupby id 和 id_2 并将其余列转换为带有列 header
的字典
我为此写了一个循环,我认为这不是 python 方式,请让我知道如何使用 pandas。
要求输出:
[{
"id": 420,
"id_2": 13.28,
"attributes":[
{ "salary": 100000,
"title":"director",
"allowance":"No",
"name": "Tom"
},
{ "salary": 70000,
"title": "developer",
"allowance":"Yes",
"name": "Sam"
}
]
},
{
"id": 110,
"id_2": 13.12,
"attributes":[
{ "salary": 120000,
"title":"director",
"allowance":"No",
"name": "Dave"
},
{ "salary": 75000,
"title": "developer",
"allowance":"Yes",
"name": "shaun"
}
]
}
]
- 没有一个单行 pandas 参数可以提供
list
的 dicts
您要求的形状。
- 使用
.groupby
到select组
g
是代表用于 groupby 的值的 tuple
d
是 groupby 值的数据帧,g
- 使用
.iterrows
遍历每组的行
- Returns
index
表示第一个_
,因为不需要
- Returns
data
,从中去掉groupby_list
中的标签,然后使用.to_dict()
将余数转换为dict
,并追加到 list
、att_list
- 遍历分组所有行后,将
att_list
作为值赋给group['attributes']
- 迭代完每个组后,将
dict
、group
附加到 dict_list
。
dict_list
可以使用以下内容转换回数据帧:
df = pd.json_normalize(dict_list, 'attributes', meta=groupby_list)
dict_list = list()
groupby_list = ['id', 'id_2']
for g, d in df.groupby(groupby_list):
group = dict(zip(groupby_list, g))
att_list = list()
for _, data in d.iterrows():
data = data.drop(labels=groupby_list)
att_list.append(data.to_dict())
group['attributes'] = att_list
dict_list.append(group)
dict_list
:
[{'attributes': [{'allowance': 'No',
'name': 'Dave',
'salary': 120000,
'title': 'director'},
{'allowance': 'Yes',
'name': 'shaun',
'salary': 75000,
'title': 'developer'}],
'id': 110,
'id_2': 13.12},
{'attributes': [{'allowance': 'No',
'name': 'Tom',
'salary': 100000,
'title': 'director'},
{'allowance': 'Yes',
'name': 'Sam',
'salary': 70000,
'title': 'developer'}],
'id': 420,
'id_2': 13.28}]
数据框:
id id_2 salary title allowance name
0420 13.28 100000 director No Tom
0420 13.28 70000 developer Yes Sam
0110 13.12 120000 director No Dave
0110 13.12 75000 developer Yes shaun
Groupby id 和 id_2 并将其余列转换为带有列 header
的字典我为此写了一个循环,我认为这不是 python 方式,请让我知道如何使用 pandas。
要求输出:
[{
"id": 420,
"id_2": 13.28,
"attributes":[
{ "salary": 100000,
"title":"director",
"allowance":"No",
"name": "Tom"
},
{ "salary": 70000,
"title": "developer",
"allowance":"Yes",
"name": "Sam"
}
]
},
{
"id": 110,
"id_2": 13.12,
"attributes":[
{ "salary": 120000,
"title":"director",
"allowance":"No",
"name": "Dave"
},
{ "salary": 75000,
"title": "developer",
"allowance":"Yes",
"name": "shaun"
}
]
}
]
- 没有一个单行 pandas 参数可以提供
list
的dicts
您要求的形状。 - 使用
.groupby
到select组g
是代表用于 groupby 的值的 d
是 groupby 值的数据帧,g
tuple
- 使用
.iterrows
遍历每组的行- Returns
index
表示第一个_
,因为不需要 - Returns
data
,从中去掉groupby_list
中的标签,然后使用.to_dict()
将余数转换为dict
,并追加到list
、att_list
- 遍历分组所有行后,将
att_list
作为值赋给group['attributes']
- Returns
- 迭代完每个组后,将
dict
、group
附加到dict_list
。 dict_list
可以使用以下内容转换回数据帧:df = pd.json_normalize(dict_list, 'attributes', meta=groupby_list)
dict_list = list()
groupby_list = ['id', 'id_2']
for g, d in df.groupby(groupby_list):
group = dict(zip(groupby_list, g))
att_list = list()
for _, data in d.iterrows():
data = data.drop(labels=groupby_list)
att_list.append(data.to_dict())
group['attributes'] = att_list
dict_list.append(group)
dict_list
:
[{'attributes': [{'allowance': 'No',
'name': 'Dave',
'salary': 120000,
'title': 'director'},
{'allowance': 'Yes',
'name': 'shaun',
'salary': 75000,
'title': 'developer'}],
'id': 110,
'id_2': 13.12},
{'attributes': [{'allowance': 'No',
'name': 'Tom',
'salary': 100000,
'title': 'director'},
{'allowance': 'Yes',
'name': 'Sam',
'salary': 70000,
'title': 'developer'}],
'id': 420,
'id_2': 13.28}]