python - 在 Python 中将 Dataframe 转换为嵌套字典
问题描述
我正在寻找一种将数据框转换为字典的方法,这与此处所问的非常相似:
假设一个样本数据框
name v1 v2 v3
0 A A1 A11 1
1 A A2 A12 2
2 B B1 B12 3
3 C C1 C11 4
4 A A2 A21 6
5 A A2 A21 8
列数可能不同,列名也可能不同。
我正在寻找生成:
{
'A' : {
'A1' : { 'A11' : 1 },
'A2' : { 'A12' : 2 , 'A21' : 6 , 'A21' : 8 },
'B1' : {},
'C1' : {}
},
'B' : {
'A1' : {},
'A2' : {},
'B1' : { 'B12' : 3},
'C1' : {}
},
'C' : {
'A1' : {},
'A2' : {},
'B1' : {} ,
'C1' : { 'C11' : 4}
}
}
其他地方建议的方法是通过递归:
def recur_dictify(frame):
if len(frame.columns) == 1:
if frame.values.size == 1: return frame.values[0][0]
return frame.values.squeeze()
grouped = frame.groupby(frame.columns[0])
d = {k: recur_dictify(g.ix[:,1:]) for k,g in grouped}
return d
这使:
>>> pprint.pprint(recur_dictify(df))
{'A': {'A1': {'A11': 1}, 'A2': {'A12': 2, 'A21': [6,8]}},
'B': {'B1': {'B12': 3}},
'C': {'C1': {'C11': 4}}}
但不会复制 v2 级别的空 dict 嵌套,并将 A2 -A21 的重复分组到 array[6,8] 中。我看过Convert a Pandas DataFrame to a dictionary,到目前为止还没有运气。
解决方案
我假设:
- 索引没有名字
- 列名具有值 A、B、C、D
- 等等
并且 df 包含上面的 recur_dictify 的输出:
ky = frame.v1.unique() # I assume it's ['A1','B1','C1']
for k in df:
for l in ky:
if l not in df[k]:
df[k][l] = {}
不过,您的原始数据框很奇怪。B2 条目不会出现在结果中的任何位置。
推荐阅读
- asp.net - 导出脚手架工具路径的动作是什么意思?
- javascript - 如何处理非活动用户并在反应 JavaScript 中注销?
- java - 将classPath中的路径与Spring Boot中资源文件夹中的路径匹配
- c# - 如何在子类中删除从父类继承的方法?
- python - 安装 xlwings 以将 Python 与 excel 一起使用时出现问题
- hl7-fhir - 如何获取包含患者详细信息和他/她已采取的索赔的 FHIR 捆绑包?
- sql - 根据有序sql表中的数字系列分配增量ID
- python - 帮帮我在 Google Colab 上训练 YOLOv3-tiny 或 YOLOv4-tiny
- sql - 从没有公共字段的两个表中提取数据
- python - Pip 在私人 github 存储库上安装 whl?