Pandas 数据框到分层字典

Sem*_*aki 5 python dictionary dataframe pandas

我有一个 4 列的 DataFrame

Subject_id    Subject         Time  Score    
Subject_1        Math          Day      1     
Subject_1        Math        Night      2                           
Subject_1       Music          Day      3
Subject_1       Music        Night      4
Subject_2        Math          Day      5       
Subject_2        Math        Night      6                              
Subject_2       Music          Day      7
Subject_2       Music        Night      8
Run Code Online (Sandbox Code Playgroud)

我想对这些列进行分层分组并将它们转换为字典,如下所示:

result = {
    'Subject_1': {
        'Math': {
            'Day': 1,
            'Night': 2 
        },
        'Music': {
            'Day': 3,
            'Night': 4
        }
    }
    'Subject_2': {
        'Math': {
            'Day': 5,
            'Night': 6
        },
        'Music': {
            'Day': 7,
            'Night': 8
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我设法pivot少用一列并获得所需的结果

df.pivot('Subject_id', 'Subject', 'Score').to_dict('index')
Run Code Online (Sandbox Code Playgroud)

但是如果我再尝试一列(更深一层的字典)

df.pivot('Subject_id', 'Subject', 'Time', 'Score').to_dict('index')
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: pivot() takes at most 4 arguments (5 given)
Run Code Online (Sandbox Code Playgroud)

我同样尝试使用groupby3 列的 lambda 函数:

df.groupby('Subject_id')
   .apply(lambda x: dict(zip(x['Subject'],x['Score'])))
   .to_dict()
Run Code Online (Sandbox Code Playgroud)

但是我无法通过 4 列获得所需的结果。

有没有办法可以给出任意数量的列并将它们转换为分层字典?

就像按特定层次结构顺序按多个字段分组一样。

Zer*_*ero 3

这是一种方法

In [86]: {k: g.pivot('Subject', 'Time', 'Score').to_dict('index') 
          for k, g in df.groupby('Subject_id')}
Out[86]:
{'Subject_1': {'Math': {'Day': 1, 'Night': 2},
  'Music': {'Day': 3, 'Night': 4}},
 'Subject_2': {'Math': {'Day': 5, 'Night': 6},
  'Music': {'Day': 7, 'Night': 8}}}
Run Code Online (Sandbox Code Playgroud)