如何在嵌套的Pandas数据框中对相同组的值求和,直至倒数第二个索引级别

1 投票
1 回答
42 浏览
提问于 2025-04-14 15:22

我根据这个帖子的说明,创建了一个从嵌套字典生成的简单示例,里面有嵌套的pandas数据框。

nested_dict = { 'Full_Grades': {
    'Science_Marks': {
        'Physics': {
            'Theo': 99,
            'Prac': 100
        },
        'Biology': {
            'Theo': 89,
            'Prac': 100
        }
    },
    'Finance_Marks': {
        'Economics': {
            'Theo': 99,
            'Prac': 100
        },
        'Accounting': {
            'Theo': 89,
            'Prac': 100
        }
    }
    }
}
import pandas as pd
out = pd.concat({k: pd.concat({k2: pd.DataFrame(v2) for k2,v2 in v.items()}, axis = 1)
                  for k, v in nested_dict.items()}, axis = 1) .unstack().to_frame().T
print(out)

这是我得到的结果 -

    Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades
    Science_Marks   Science_Marks   Science_Marks   Science_Marks   Finance_Marks   Finance_Marks   Finance_Marks   Finance_Marks
    Physics Physics Biology Biology Economics   Economics   Accounting  Accounting
    Theo    Prac    Theo    Prac    Theo    Prac    Theo    Prac
0   99      100     89      100     99      100     89      100

有没有人能建议一种方法,来把同一组的数字加起来,直到倒数第二个索引层级?比如说,在组 Full_Grades-Science_Marks-Physics 下,Physics 的总和应该是199。最后一个索引层级的名字不同(比如 TheoPractical)也没关系。

对于这个帖子,我没有任何工作成果可以展示,因为我真的不知道该从哪里开始。另外,如果问题的标题或内容不清楚,我也很抱歉。我尽力写得清楚。如果需要进一步的解释,请告诉我。

编辑 1:这是我想要的输出 -

    Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades Full_Grades
    Science_Marks   Science_Marks   Science_Marks   Science_Marks   Finance_Marks   Finance_Marks   Finance_Marks   Finance_Marks
    Physics Physics Biology Biology Economics   Economics   Accounting  Accounting
    Theo    Prac    Theo    Prac    Theo    Prac    Theo    Prac
0   99      100     89      100     99      100     89      100
Sum     199            189             199             189

此外,我也希望能找到一种方法,来访问第 0 行对应的值,这样我就可以进行各种分析,比如求和、平均值等等。

1 个回答

1

与其使用 unstack,不如用 sum 来对行进行汇总:

import pandas as pd
out = pd.concat({k: pd.concat({k2: pd.DataFrame(v2) for k2,v2 in v.items()}, axis = 1)
                  for k, v in nested_dict.items()}, axis = 1).sum().to_frame().T

输出结果:

    Full_Grades                                 
  Science_Marks         Finance_Marks           
        Physics Biology     Economics Accounting
0           199     189           199        189

撰写回答