从DataFrame到父索引 - Python / Pandas的值和

时间:2016-11-11 23:30:34

标签: python pandas dataframe

我正在处理Mint交易数据,并试图将每个类别的值加到它的父类别中。

我有一个数据帧mint_data,它是从我的所有Mint交易中创建的:

FooBar

mint_data image

带有Category:Parent对的dict(这使用xlwings从excel表中提取)

Path

Cat:Parent image

我不确定如何循环使用mint_data df并将金额汇总到父类别中。我想保持数据框格式完全相同,只需替换父值。

以下是df:

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

我还有

的词典
cat_parent = cats_sheet.range('A1').expand().options(dict).value

我试图让数据框最终以

结束
        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

1 个答案:

答案 0 :(得分:1)

让我们打电话给你的字典" 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