我正在处理Mint交易数据,并试图将每个类别的值加到它的父类别中。
我有一个数据帧mint_data,它是从我的所有Mint交易中创建的:
FooBar
带有Category:Parent对的dict(这使用xlwings从excel表中提取)
Path
我不确定如何循环使用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
答案 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