【问题标题】:Can someone explain what am I doing wring in converting this dataframe to dictionary in Python有人可以解释我在将数据框转换为 Python 中的字典时做错了什么吗
【发布时间】:2020-12-24 09:37:38
【问题描述】:
index      print_type_solid      print_type_floral  cluster
     A           10                     10            2
     B           20                     20            2
     A           10                     10            3
     B           20                     20            3
     C           25                     30            3

有人可以帮我将上述数据框转换为以下嵌套字典,其中集群成为主键,print_type_x 作为键,然后是下面预期输出中所示的值?

 {  
 "2" :{
        "print_type_solid" : {
          "A": 10,
          "B": 20
                            },
        "print_type_floral" : {
            "A": 10,
            "B": 20
                             }
        },

"3" :{
        "print_type_solid" : {
          "A": 10,
          "B": 20,
          "C": 25,
                            },
        "print_type_floral" : {
            "A": 10,
            "B": 20,
            "C": 30,
                             }
        }

}

我试过这个:

from collections import defaultdict
d = defaultdict()
d2={}


for k1, s in dct.items():
    for k2, v in s.items():
        for k3, r in v.items():
            d.setdefault(k3, {})[k2] = r

    d2[k1]=d

但我明白了:

 {  
 "2" :{
        "print_type_solid" : {
          "A": 10,
          "B": 20,
          "C": 25
                            },
        "print_type_floral" : {
            "A": 10,
            "B": 20,
            "C": 30
                             }
        },

"3" :{
        "print_type_solid" : {
          "A": 10,
          "B": 20,
          "C": 25,
                            },
        "print_type_floral" : {
            "A": 10,
            "B": 20,
            "C": 30,
                             }
        }

}

这是错误的,因为我在集群 2 的字典中也得到了 C。

【问题讨论】:

  • 你想做什么?
  • 为什么要使用 defaultdict 和 setdefault?为什么不是 defaultdict(dict)?你了解 defaultdicts 是如何工作的吗?

标签: python pandas dataframe dictionary nested


【解决方案1】:

您可以使用df.iterrows() 逐行迭代您的数据框。要创建字典,您可以使用:

import pandas as pd

df = pd.DataFrame( {"index":list("ABABC"),
                    "print_type_solid":[10,20,10,20,25],
                    "print_type_floral":[10,20,10,20,30],
                    "cluster":[2,2,3,3,3] }) 

print(df)

d = {}
pts = "print_type_solid"
ptf = "print_type_floral"

for idx, row in df.iterrows():
    key = d.setdefault(row["cluster"],{})

    key_pts = key.setdefault(pts,{})
    key_pts[row["index"]] = row[pts]

    key_ptf = key.setdefault(ptf,{})
    key_ptf[row["index"]] = row[ptf]


from pprint import pprint
pprint(d)

输出:

# df
  index  print_type_solid  print_type_floral  cluster
0     A                10                 10        2
1     B                20                 20        2
2     A                10                 10        3
3     B                20                 20        3
4     C                25                 30        3

# dict
{2: {'print_type_floral': {'A': 10, 'B': 20},
     'print_type_solid':  {'A': 10, 'B': 20}},
 3: {'print_type_floral': {'A': 10, 'B': 20, 'C': 30},
     'print_type_solid':  {'A': 10, 'B': 20, 'C': 25}}}

您也可以使用collections.defaultdict - 但对于少数数据点,这不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-12-13
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多