python - 数据框按大小分组到嵌套字典(多个层次结构)

标签 python pandas numpy

我有这个代码:

df.groupby(by=["Unit","Product","Scheme","Type"]).size()

这给出:

Unit           Product       Scheme        Type
JBBNB          BP            KRZPS         MRTZN               13
                                           TOPUP                5
                                           ZBPRE                3
               HB            KRJZS         CONST                6
                                           FZNEW                5
                                                               ..
htrcy          HB            TNJZS         PZTCN                2
                             TNBTS         TOEJZ                2
               TU            TNTPS         BDDFIN               2
                                           TOPUP                1
hwrng          BP            TGZPS         ZBPRE                1
Length: 1632, dtype: int64

我想将其转换为带有嵌套字典的 dict() ,如下所示

{
    "JBBNB": {"BP": {"KRZPS":{"MRTZN":13,"TOPUP":5,"ZBPRE":3}},
              "HB":{"KRJZS":{"CONST":6,"FZNEW":5}}
             },
    "htrcy": {"HB": {"TNJZS":{"PZTCN":2}, 
                    "TNBTS":{"TOEJZ":2}},
              "TU":{"TNTPS":{"BDDFIN":2,"TOPUP":1}},
             }
}

我怎样才能以最有效的方式做到这一点

编辑: 这是我的数据

data = {"Unit": {"31-08": "JBJEB", "22-11": "JBGRB", "06-04": "JBGRB", "29-11": "JBZWI", "15-02": "JBGRB", "28-02": "JBJEB", "23-03": "JBGRB", "13-06": "JBJEB", "30-06": "JBMDR", "20-07": "JBJEB", "23-07": "JBJEB", "25-07": "JBJEB", "23-08": "JBJEB", "30-09": "JBZWR", "22-10": "JBJEB", "27-12": "JBJMD", "31-12": "JBJEB", "25-03": "JBJEB", "29-03": "JBJEB", "29-04": "JBJEB", "29-07": "JBJEB", "18-06": "JBJMD", "30-07": "JBMDR", "10-08": "JBJMR", "24-03": "JBJMD", "19-07": "JBJMD", "26-12": "JBJMD", "31-03": "JBJMR", "08-09": "JBJMR", "07-10": "JBJMR", "10-05": "JBJMR", "28-07": "JBJMR", "27-09": "JBJMR", "27-11": "JBJMR", "30-11": "JBJMR", "22-12": "JBJMR", "24-07": "JBZJB", "23-09": "JBZWI", "29-09": "JBZWI", "07-02": "JBZWI", "14-10": "JBZWR", "23-12": "JBZWR", "29-08": "JBZWR", "18-11": "JBZWR", "21-12": "JBZWR", "03-01": "JBZWR", "28-08": "JBZWR", "20-09": "JBMDR", "02-12": "JBMDR"}, "Product": {"31-08": "TU", "22-11": "TU", "06-04": "TU", "29-11": "TU", "15-02": "TU", "28-02": "TU", "23-03": "TU", "13-06": "TU", "30-06": "TU", "20-07": "TU", "23-07": "TU", "25-07": "TU", "23-08": "TU", "30-09": "TU", "22-10": "TU", "27-12": "TU", "31-12": "TU", "25-03": "TU", "29-03": "TU", "29-04": "TU", "29-07": "TU", "18-06": "TU", "30-07": "TU", "10-08": "TU", "24-03": "TU", "19-07": "TU", "26-12": "TU", "31-03": "TU", "08-09": "BP", "07-10": "TU", "10-05": "TU", "28-07": "TU", "27-09": "TU", "27-11": "TU", "30-11": "TU", "22-12": "TU", "24-07": "TU", "23-09": "TU", "29-09": "TU", "07-02": "TU", "14-10": "BP", "23-12": "BP", "29-08": "TU", "18-11": "TU", "21-12": "TU", "03-01": "TU", "28-08": "TU", "20-09": "TU", "02-12": "TU"}, "Scheme": {"31-08": "GJTPS", "22-11": "UPTPS", "06-04": "UPTPS", "29-11": "UKTPS", "15-02": "UPTPS", "28-02": "GJTPS", "23-03": "UPTPS", "13-06": "GJTPS", "30-06": "MJTPS", "20-07": "GJTPS", "23-07": "GJTPS", "25-07": "GJTPS", "23-08": "GJTPS", "30-09": "RJTPS", "22-10": "GJTPS", "27-12": "GJTPS", "31-12": "GJTPS", "25-03": "GJTPS", "29-03": "GJTPS", "29-04": "GJTPS", "29-07": "GJTPS", "18-06": "GJTPS", "30-07": "MJTPS", "10-08": "RJTPS", "24-03": "GJTPS", "19-07": "GJTPS", "26-12": "GJTPS", "31-03": "RJTPS", "08-09": "RJZPS", "07-10": "RJTPS", "10-05": "RJTPS", "28-07": "RJTPS", "27-09": "RJTPS", "27-11": "RJTPS", "30-11": "RJTPS", "22-12": "RJTPS", "24-07": "UPTPS", "23-09": "UKTPS", "29-09": "UKTPS", "07-02": "UKTPS", "14-10": "RJZPS", "23-12": "RJZPS", "29-08": "RJTPS", "18-11": "RJTPS", "21-12": "RJTPS", "03-01": "RJTPS", "28-08": "RJTPS", "20-09": "MJTPS", "02-12": "MJTPS"}, "Type": {"31-08": "BDDFIN", "22-11": "BDDFIN", "06-04": "BDDFIN", "29-11": "BDDFIN", "15-02": "BDDFIN", "28-02": "BDDFIN", "23-03": "BDDFIN", "13-06": "BDDFIN", "30-06": "BDDFIN", "20-07": "BDDFIN", "23-07": "BDDFIN", "25-07": "BDDFIN", "23-08": "BDDFIN", "30-09": "BDDFIN", "22-10": "BDDFIN", "27-12": "BDDFIN", "31-12": "BDDFIN", "25-03": "BDDFIN", "29-03": "BDDFIN", "29-04": "BDDFIN", "29-07": "BDDFIN", "18-06": "BDDFIN", "30-07": "BDDFIN", "10-08": "BDDFIN", "24-03": "BDDFIN", "19-07": "BDDFIN", "26-12": "BDDFIN", "31-03": "BDDFIN", "08-09": "BDDFIN", "07-10": "BDDFIN", "10-05": "BDDFIN", "28-07": "BDDFIN", "27-09": "BDDFIN", "27-11": "BDDFIN", "30-11": "BDDFIN", "22-12": "BDDFIN", "24-07": "BDDFIN", "23-09": "BDDFIN", "29-09": "BDDFIN", "07-02": "BDDFIN", "14-10": "BDDFIN", "23-12": "BDDFIN", "29-08": "BDDFIN", "18-11": "BDDFIN", "21-12": "BDDFIN", "03-01": "BDDFIN", "28-08": "BDDFIN", "20-09": "BDDFIN", "02-12": "BDDFIN"}}
df = pd.DataFrame(data)

最佳答案

让我们使用一些递归和groupby来定义一个函数

def dictify(df, cols):
    if not cols:
        return len(df)

    return {k: dictify(g, cols[1:]) for k, g in df.groupby(cols[0])}

然后使用参数调用

dictify(df, ["Unit","Product","Scheme","Type"])

这是结果

{'JBGRB': {'TU': {'UPTPS': {'BDDFIN': 4}}},
 'JBJEB': {'TU': {'GJTPS': {'BDDFIN': 13}}},
 'JBJMD': {'TU': {'GJTPS': {'BDDFIN': 5}}},
 'JBJMR': {'BP': {'RJZPS': {'BDDFIN': 1}}, 'TU': {'RJTPS': {'BDDFIN': 9}}},
 'JBMDR': {'TU': {'MJTPS': {'BDDFIN': 4}}},
 'JBZJB': {'TU': {'UPTPS': {'BDDFIN': 1}}},
 'JBZWI': {'TU': {'UKTPS': {'BDDFIN': 4}}},
 'JBZWR': {'BP': {'RJZPS': {'BDDFIN': 2}}, 'TU': {'RJTPS': {'BDDFIN': 6}}}}

关于python - 数据框按大小分组到嵌套字典(多个层次结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74808903/

相关文章:

python - Pandas 通过 iloc 减去系列,而不是通过索引

python - 按过滤条件的 Pandas 样本

python - 如何在 pandas 系列上实现 "not"过滤器(而不是数据帧)

python - 根据索引向量在 numpy 中重复行

python语义代理/服务器,使用哪个框架?

python - 为什么 Selenium python 包中缺少 expected_conditions all_of、none_of 和 any_of?

python - 如何在 numpy 向量中的每个元素之间应用 linspace?

python - 数学方程的 Numpy 向量化

python - 解释一下这个算法

python - 在 DataFrame 中创建新列