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)
我同样尝试使用groupby
3 列的 lambda 函数:
df.groupby('Subject_id')
.apply(lambda x: dict(zip(x['Subject'],x['Score'])))
.to_dict()
Run Code Online (Sandbox Code Playgroud)
但是我无法通过 4 列获得所需的结果。
有没有办法可以给出任意数量的列并将它们转换为分层字典?
就像按特定层次结构顺序按多个字段分组一样。
这是一种方法
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)