【问题标题】:Pandas multi index dataframe to nested dictionary熊猫多索引数据框到嵌套字典
【发布时间】:2017-02-10 03:01:49
【问题描述】:

假设我有以下数据框

df = pd.DataFrame({0: {('A', 'a'): 1, ('A', 'b'): 6, ('B', 'a'): 2, ('B', 'b'): 7},
 1: {('A', 'a'): 2, ('A', 'b'): 7, ('B', 'a'): 3, ('B', 'b'): 8},
 2: {('A', 'a'): 3, ('A', 'b'): 8, ('B', 'a'): 4, ('B', 'b'): 9},
 3: {('A', 'a'): 4, ('A', 'b'): 9, ('B', 'a'): 5, ('B', 'b'): 1},
 4: {('A', 'a'): 5, ('A', 'b'): 1, ('B', 'a'): 6, ('B', 'b'): 2}})

看起来像这样:

     0  1  2  3  4
A a  1  2  3  4  5
  b  6  7  8  9  1
B a  2  3  4  5  6
  b  7  8  9  1  2

当我通过to_dict 将其转换为字典时(无论是否堆叠、取消堆叠),我都会得到一个其键为元组的字典:

df.transpose().to_dict()

{('A', 'a'): {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
 ('A', 'b'): {0: 6, 1: 7, 2: 8, 3: 9, 4: 1},
 ('B', 'a'): {0: 2, 1: 3, 2: 4, 3: 5, 4: 6},
 ('B', 'b'): {0: 7, 1: 8, 2: 9, 3: 1, 4: 2}}

我想要的是这样的嵌套字典:

{'A':{'a': {0: 1, 1:2, 2:3, 3:4, 4:5}, 'b':{0:6, 1:7, 2:8, 3:9,4:1}...

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以使用字典推导遍历外部级别(值“A”和“B”),并使用xs 方法按这些级别对帧进行切片。

    {level: df.xs(level).to_dict('index') for level in df.index.levels[0]}
    
    {'A': {'a': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
      'b': {0: 6, 1: 7, 2: 8, 3: 9, 4: 1}},
     'B': {'a': {0: 2, 1: 3, 2: 4, 3: 5, 4: 6},
      'b': {0: 7, 1: 8, 2: 9, 3: 1, 4: 2}}}
    

    【讨论】:

    • 从来不知道 xs 方法。效果很好!谢谢!
    • 我在具有 3 级 idexes 的数据框上尝试了这个。不幸的是没有工作。
    • @NikhilVJ 您可以将此方法扩展到任意数量的级别。对于每个附加级别,您只需要在前一个字典理解周围嵌套另一个字典理解。这是 2 个级别的示例:{level0: {level1: df.xs([level0, level1]).to_dict('index') for level1 in df.index.levels[1]} for level0 in df.index.levels[0]}
    • 为什么是to_dict('index') 而不仅仅是to_dict()
    【解决方案2】:

    对于 n 个级别,你可以有这样的递归:

    def createDictFromPandas(df):
        if (df.index.nlevels==1):
            return df.to_dict()
        dict_f = {}
        for level in df.index.levels[0]:
            if (level in df.index):
                dict_f[level] = createDictFromPandas(df.xs([level]))
        return dict_f
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-21
      • 2021-02-04
      • 2017-12-03
      • 2023-03-23
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多