새 응답
참고 : 나는 'portfolio'
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
설정
에 열 이름
'subportfolio'
변경 6,
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