我正在处理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/