pandas 如何groupby一个dataframe的两列,并将其他列转换为dict,列标题为键

iswrvxsc  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(147)

数据框:

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的方式,请让我知道如何用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"
                    }
                ]
            }   
]
lmyy7pcs

lmyy7pcs1#

  • 没有一行panda参数可以提供您所请求的dictslist
  • 使用.groupby选择组
  • g是表示用于groupby的值的tuple
  • d是groupby值g的 Dataframe
  • 使用.iterrows遍历每个组的行
  • 返回由第一个_表示的index,因为不需要它
  • 返回datagroupby_list中的标签将从data中删除,然后使用.to_dict()将余数转换为dict,并将其附加到listatt_list
  • 遍历组中的所有行后,将att_list赋值为group['attributes']
  • 每个组迭代完成后,将dictgroup附加到dict_list
  • dict_list可以转换回 Dataframe ,如下所示:
  • 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}]
wz3gfoph

wz3gfoph2#

df1.groupby(['id','id_2']).apply(lambda dd:dd.iloc[:,2:].to_dict('r'))\
    .to_frame("attributes").reset_index().to_dict('r')

输出:

[{'id': 110,
  'id_2': 13.12,
  'attributes': [{'salary': 120000,
    'title': 'director',
    'allowance': 'No',
    'name': 'Dave'},
   {'salary': 75000,
    'title': 'developer',
    'allowance': 'Yes',
    'name': 'shaun'}]},
 {'id': 420,
  'id_2': 13.28,
  'attributes': [{'salary': 100000,
    'title': 'director',
    'allowance': 'No',
    'name': 'Tom'},
   {'salary': 70000,
    'title': 'developer',
    'allowance': 'Yes',
    'name': 'Sam'}]}]

相关问题