新しい答え
注:私は、列名を変更し'subportfolio'
def agg_lvl(t1, t2): lcol = ['level', 'portfolio'] rcol = ['parent', 'portfolio'] kwargs = dict( left_on='portfolio', right_on='parent', suffixes=['_', ''] ) lvl = t2[lcol].merge(t2[rcol], **kwargs).drop('portfolio_', 1).merge(t1) lvl = lvl.groupby('parent').value.sum().rename_axis('portfolio').reset_index() return t1.append(lvl, ignore_index=True).drop_duplicates(), t2 o1, o2 = agg_lvl(*agg_lvl(table1, table2)) o2.merge(o1) level parent portfolio value 0 1 top-alpha top-alpha-1 1 1 1 top-alpha top-alpha-2 2 2 1 top-alpha top-alpha-3 3 3 1 top-beta top-beta-1 4 4 1 top-beta top-beta-2 5 5 1 top-beta top-beta-3 6 6 1 top-gamma top-gamma-1 7 7 1 top-gamma top-gamma-2 8 8 1 top-gamma top-gamma-3 9 9 2 top top-alpha 6 10 2 top top-beta 15 11 2 top top-gamma 24 12 3 self top 45
'portfolio'
に設定
table2 = pd.DataFrame({
'level': [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3],
'parent': [
'top-alpha',
'top-alpha',
'top-alpha',
'top-beta',
'top-beta',
'top-beta',
'top-gamma',
'top-gamma',
'top-gamma',
'top',
'top',
'top',
'self'],
'portfolio': [
'top-alpha-1',
'top-alpha-2',
'top-alpha-3',
'top-beta-1',
'top-beta-2',
'top-beta-3',
'top-gamma-1',
'top-gamma-2',
'top-gamma-3',
'top-alpha',
'top-beta',
'top-gamma',
'top']})
table1 = pd.DataFrame({
'portfolio': ['top-alpha-1', 'top-alpha-2', 'top-alpha-3', 'top-beta-1', 'top-beta-2', 'top-beta-3', 'top-gamma-1', 'top-gamma-2', 'top-gamma-3'],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]
})
古い答え
このソリューションは、私の別のソリューションを活用し、正確に何が必要ではないかもしれない...しかし、その後、再び、あなたはあなたが必要な正確に何それを明確にしませんでした。だから私はいくつかの自由を取った
最初に私はあなたのsubportfolio
の列を'-'
で分割した別のデータフレームdf
を作成しました。
col = 'subportfolio'
rnm_dict = dict(enumerate(list('321')))
df = table1.drop(col, 1).join(table1[col].str.split('-', expand=True).rename(columns=rnm_dict))
print(df)
value 3 2 1
0 1 top alpha 1
1 2 top alpha 2
2 3 top alpha 3
3 4 top beta 1
4 5 top beta 2
5 6 top beta 3
6 7 top gamma 1
7 8 top gamma 2
8 9 top gamma 3
は今の集約にすべての答えを
agged = pd.concat([
df.assign(
**{x: '' for x in '321'[i:]}
).groupby(list('321')).sum() for i in range(1, 4)
]).sort_index()
table2.join(agged.set_index(agged.index.to_series().str.join('-').str.strip('-').values), on='portfolio')
level parent portfolio value
0 1 top-alpha top-alpha-1 1
1 1 top-alpha top-alpha-2 2
2 1 top-alpha top-alpha-3 3
3 1 top-beta top-beta-1 4
4 1 top-beta top-beta-2 5
5 1 top-beta top-beta-3 6
6 1 top-gamma top-gamma-1 7
7 1 top-gamma top-gamma-2 8
8 1 top-gamma top-gamma-3 9
9 2 top top-alpha 6
10 2 top top-beta 15
11 2 top top-gamma 24
12 3 self top 45