DataFrame groupby具有字典值的列

2024-09-25 02:28:26 发布

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

我有一个数据框,其中包含一列作为字典。我需要根据字典值对列进行分组。比如说,

import pandas as pd
    
data = [
         {
            "name":"xx",
            "values":{
                "element":[
                    {
                        "path":"path1/id1"
                    },
                    {
                        "path":"path2/id1"
                    }
                ],
                "nonrequired":[
                    {}
                ]
            }
         },
        {
                "name":"yy",
                "values":{
                    "element":[
                        {
                            "path":"path1/id2"
                        },
                        {
                            "path":"path2/id2"
                        }
                    ],
                    "nonrequired":[
                        {}
                    ]
                }
             }
       ]

df = pd.DataFrame(data)

我在找什么,

  1. 我想按特定键内的“值”列进行分组
  2. 分组应为值->;元素->;路径
  3. 分组应基于部分路径值。例如,如果path=“path1/id2”,则 分组应基于path=“path1”
  4. 分组后,我需要将结果提取为字典

预期结果:

result = {
            'path1': [
                        {
                            "name":'xx',
                            "renamecolumn":['id1','id2']
                        }
                    ],
            'path2': [
                        {
                            "name":'yy',
                            "renamecolumn":['id1','id2']
                        }
                    ]
        }

Tags: pathnamegtdata字典elementpdvalues
1条回答
网友
1楼 · 发布于 2024-09-25 02:28:26

由于示例输入和输出不完全匹配,仍然不能100%确定最终字典创建的逻辑。但是,下面是如何提取值,并从中创建所需的字典

# ectract the values and split them on the forward slash
df['split'] = df['values'].apply(lambda x: [item['path'].split('/') for item in x['element']])

# generate the path and ids columns
df['path'] = df['split'].apply(lambda x: [x[i][0] for i in range(0,len(x))])
df['ids'] = df['split'].apply(lambda x: [x[i][1] for i in range(0,len(x))])

# separate out all the lists and 
result = df.drop(['values', 'split'], axis=1) \
  .explode('ids').explode('path').drop_duplicates()

Result是:

  name   path  ids
0   xx  path1  id1
0   xx  path2  id1
1   yy  path1  id2
1   yy  path2  id2

相关问题 更多 >