를 사용하여 groupby 개체에서 집계 된 값을 원하는만큼 반환 할 수 apply있습니다. 간단히 Series를 반환하면 인덱스 값이 새 열 이름이됩니다.
간단한 예를 보겠습니다.
df = pd.DataFrame({'group':['a','a','b','b'],
'd1':[5,10,100,30],
'd2':[7,1,3,20],
'weights':[.2,.8, .4, .6]},
columns=['group', 'd1', 'd2', 'weights'])
df
group d1 d2 weights
0 a 5 7 0.2
1 a 10 1 0.8
2 b 100 3 0.4
3 b 30 20 0.6
에 전달 될 사용자 지정 함수를 정의합니다 apply. data매개 변수가 DataFrame임을 의미하는 DataFrame을 암시 적으로 허용합니다 . agggroupby 메서드 에서는 불가능한 여러 열을 사용하는 방법 에 유의하십시오.
def weighted_average(data):
d = {}
d['d1_wa'] = np.average(data['d1'], weights=data['weights'])
d['d2_wa'] = np.average(data['d2'], weights=data['weights'])
return pd.Series(d)
apply사용자 지정 함수를 사용 하여 groupby 메서드를 호출합니다 .
df.groupby('group').apply(weighted_average)
d1_wa d2_wa
group
a 9.0 2.2
b 58.0 13.2
다른 답변에서 설명한대로 가중치 합계를 새 DataFrame 열로 미리 계산하여 더 나은 성능을 얻을 수 있으며 함께 사용하지 마십시오 apply.