我正在处理Mint事务数据,并尝试将每个类别的值相加为其父类别。
我有一个数据框mint_数据,它是从我所有的mint事务中创建的:

mint_data = tranactions_data.pivot(index='Category', columns='Date', values='Amount')

mint_data image
以及一个带有Category:Parent对的dict(它使用xlwings从excel工作表中拉取)
cat_parent = cats_sheet.range('A1').expand().options(dict).value

Cat:Parent image
我不知道如何循环使用mint_data df并将数量相加到父类别中。我想保持数据帧格式完全相同,只是替换父值。
下面是一个示例df:
        A B C D E
par_a   0 0 5 0 0
cat1a   5 2 3 2 1
cat2a   0 1 2 1 0
par_b   1 0 1 1 2
cat1b   0 1 2 1 0
cat2b   1 1 1 1 1
cat3b   0 1 2 1 0

我还有一个
{'par_a': 'par_a',
 'cat1a': 'par_a',
 'cat2a': 'par_a',
 'par_b': 'par_b',
 'cat1b': 'par_b',
 'cat2b': 'par_b',
 'cat3b': 'par_b'}

我想让数据帧以
        A B C D E
par_a   5 3 10 3 1
cat1a   5 2 3 2 1
cat2a   0 1 2 1 0
par_b   2 3 6 4 3
cat1b   0 1 2 1 0
cat2b   1 1 1 1 1
cat3b   0 1 2 1 0

最佳答案

让我们将字典称为“dct”,然后创建一个映射到父级的新列:

>>> df['parent'] = df.reset_index()['index'].map(dct).values

       A  B  C  D  E parent
par_a  0  0  5  0  0  par_a
cat1a  5  2  3  2  1  par_a
cat2a  0  1  2  1  0  par_a
par_b  1  0  1  1  2  par_b
cat1b  0  1  2  1  0  par_b
cat2b  1  1  1  1  1  par_b
cat3b  0  1  2  1  0  par_b

然后按父项求和:
>>> df_sum = df.groupby('parent').sum()

        A  B   C  D  E
parent
par_a   5  3  10  3  1
par_b   2  3   6  4  3

在许多情况下,您可能会到此为止,但由于您希望合并父/子数据,因此需要某种合并。combine_first在这里工作得很好,因为它会有选择地向您想要的方向更新:
>>> df_new = df_sum.combine_first(df)

         A    B     C    D    E parent
cat1a  5.0  2.0   3.0  2.0  1.0  par_a
cat1b  0.0  1.0   2.0  1.0  0.0  par_b
cat2a  0.0  1.0   2.0  1.0  0.0  par_a
cat2b  1.0  1.0   1.0  1.0  1.0  par_b
cat3b  0.0  1.0   2.0  1.0  0.0  par_b
par_a  5.0  3.0  10.0  3.0  1.0  par_a
par_b  2.0  3.0   6.0  4.0  3.0  par_b

您在注释中提到了一个多索引,因此您可能更喜欢这样组织它:
>>> df_new.reset_index().set_index(['parent','index']).sort_index()

                A    B     C    D    E
parent index
par_a  cat1a  5.0  2.0   3.0  2.0  1.0
       cat2a  0.0  1.0   2.0  1.0  0.0
       par_a  5.0  3.0  10.0  3.0  1.0
par_b  cat1b  0.0  1.0   2.0  1.0  0.0
       cat2b  1.0  1.0   1.0  1.0  1.0
       cat3b  0.0  1.0   2.0  1.0  0.0
       par_b  2.0  3.0   6.0  4.0  3.0

关于python - 从DataFrame到父索引的总和-Python/Pandas,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40557822/

10-11 12:58