使用分组列从数据框中生成字典

generate dict from datarame with grouping columns

我尝试生成一个 json 文件或 dict rom 我的 datframe(对列进行分组)

我的数据帧是

    df1 = pd.DataFrame({
        'USER': ['ALL','ALL','BOB','STEVE','PAUL','KEITH','STEVE','STEVE','BOB'],
        'CITY': ['ALL','ALL','PARIS','LONDON','MILAN','MADRID','LONDON','LONDON','PARIS'],
        'TEAMS':['USA','EUROPE','Middle EST','CHINA','JAPAN','MORROCO','Fr','ENGLAN','AUSTRIA'],
        'TASK':['ALL','MANY','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN']})

预期的输出应该是这样的:

exepectdict ={
     [{
     'USER':'ALL',
      'CITY':'ALL',
       'work':
           { 'USA':'ALL',
             'EUROPE':'MANY'
            }
     
     },
      {
     'USER':'BOB',
      'CITY':'PARIS',
       'work':
           { 'Middle EST':'ONE',
             'AUSTRIA':'SEVEN'
            }
     
     },
      {
     'USER':'KEITH',
      'CITY':'MADRID',
       'work':
           { 'MORROCO':'FOUR'
            }
     
     },
           
      {
     'USER':'PAUL',
      'CITY':'MILAN',
       'work':
           { 'JAPAN':'THREE'
            }
     
     },
           
      {
     'USER':'STEVE',
      'CITY':'LONDON',
       'work':
           { 'CHINA':'TWO',
             'Fr':'FIVE',
              'ENGLAN':'SIX'
            }
     
     }
          
    ]}

为此,我尝试对行 (USER?CITY) 进行分组并为(TEAMS 和 TASK 列)生成一个列表:

    df_results=df1.groupby(['USER','CITY'])['TEAMS','TASK'].agg(list)
|USER | CITY    |      TEAMS            |       TASK       |               
|:----|:-------:|:---------------------:|-----------------:|
|ALL  |   ALL   |          [USA, EUROPE]|       [ALL, MANY]|
|BOB  |   PARIS |  [Middle EST, AUSTRIA]|      [ONE, SEVEN]|
|KEITH| MADRID  |              [MORROCO]|            [FOUR]|
|PAUL |  MILAN  |                [JAPAN]|           [THREE]|
|STEVE| LONDON  |    [CHINA, Fr, ENGLAN]|  [TWO, FIVE, SIX]|

但我不知道如何生成预期的字典格式

为“work”创建一个列,因为它是 TEAMS:TASK 在 groupby

期间的一对一映射
df_results = pd.DataFrame(df.groupby(['USER','CITY'])[['TEAMS','TASK']].apply(lambda x:dict(zip(x['TEAMS'],x['TASK']))), columns=['work'])
df_results.reset_index().to_dict('records')