如何将数据框的两列分组并将其他列转换为以列 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 参数可以提供 listdicts 您要求的形状。
  • 使用.groupby到select组
    • g 是代表用于 groupby
    • 的值的 tuple
    • d 是 groupby 值的数据帧,g
  • 使用.iterrows遍历每组的行
    • Returns index表示第一个_,因为不需要
    • Returns data,从中去掉groupby_list中的标签,然后使用.to_dict()将余数转换为dict,并追加到 listatt_list
    • 遍历分组所有行后,将att_list作为值赋给group['attributes']
  • 迭代完每个组后,将 dictgroup 附加到 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}]