2017-11-22 2 views
2

가 나는 DF가 값 :팬더, 새로운 열 적용 GROUPBY을 만들 수는

그래서 인덱스 값이 같은 라벨 열을 기반으로 얻을 COL1과 Col2의에 GROUPBY하기 위해 노력하고있어
Col1 Col2 Label 
0  0  5345 
1  0  7574 
2  0  3445 
0  1  2126 
1  1  4653 
2  1  9566 

:

df_gb = df.groupby(['Col1','Col2'])['Label'].agg(['sum', 'count']) 
df_gb['sum_count'] = df_gb['sum']/df_gb['count'] 
sum_count_total = df_gb['sum_count'].sum() 
index = df_gb['sum_count']/10 

Col2 Col1  
0  0   2.996036 
     1   3.030063 
     2   3.038579 

1  0   2.925314 
     1   2.951295 
     2   2.956083 

2  0   2.875549 
     1   2.899254 
     2   2.905063 

지금까지 모든 것이 예상대로입니다. 하지만 이제는이 'groupby df'를이 두 groupby 열을 기반으로하는 원래 'df'에 할당하려고합니다. 하나의 열만 있다면 map() 함수로 작동하지만 두 개의 열 순서에 따라 인덱스 값을 할당하고 싶지는 않습니다.

df_index = df.copy() 
df_index['index'] = df.groupby([]).apply(index) 
TypeError: 'Series' objects are mutable, thus they cannot be hashed 

agg() 및 transform()으로 시도했지만 성공하지 못했습니다. 어떤 아이디어를 진행할 것인가?

미리 감사드립니다. Hristo.

답변

5

난 당신이 join 필요 믿는다

a = df.join(index.rename('new'), on=['Col1','Col2']) 
print (a) 
    Col1 Col2 Label new 
0  0  0 5345 534.5 
1  1  0 7574 757.4 
2  2  0 3445 344.5 
3  0  1 2126 212.6 
4  1  1 4653 465.3 
5  2  1 9566 956.6 

또는 GroupBy.transform :

df.groupby(['Col1','Col2'])['Label'].transform('mean')/10 
:
df['new']=df.groupby(['Col1','Col2'])['Label'].transform(lambda x: x.sum()/x.count())/10 
print (df) 
    Col1 Col2 Label new 
0  0  0 5345 534.5 
1  1  0 7574 757.4 
2  2  0 3445 344.5 
3  0  1 2126 212.6 
4  1  1 4653 465.3 
5  2  1 9566 956.6 

그리고 Zero 제안에서 Label 열 사용 솔루션에는 NaN의, 감사하지 않는 경우

필요하지 않은 경우에만 값을 과 함께 사용하십시오.

+0

조인이 완벽하게 작동합니다. GroupBy.transform()으로 시도해 볼 것입니다. 감사합니다 milion mate! :) –

+0

예, 두 번째 솔루션은 빠릅니다. 천만에요! – jezrael

+1

둘째로'df.groupby ([ 'Col1', 'Col2']) [ '레이블']. 변형 ('평균')/10' 일 수 있습니까? – Zero