如何按数据帧的两列分组,并将其他列转换为以列标题为键的dict

2024-06-01 00:44:49 发布

您现在位置:Python中文网/ 问答频道 /正文

数据帧:

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并将其余列转换为带有列标题的dict

我为此写了一个循环,我认为这不是python的方式,请让我知道如何使用熊猫

所需输出:

[{
            "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"
                    }
                ]
            }   
]

Tags: 数据nonameiddevelopertitlesamattributes
1条回答
网友
1楼 · 发布于 2024-06-01 00:44:49
  • 没有一个单行熊猫参数可以在您请求的形状中提供listdicts
  • 使用^{}选择组
    • gtuple表示用于分组的值
    • d是groupby值的数据帧,g
  • 使用^{}遍历每个组的行
    • 返回由第一个_表示的index,因为不需要它
    • 返回data,从中删除groupby_list中的标签,然后使用^{}将余数转换为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}]

相关问题 更多 >