2017-01-19 4 views
2

2 개의 열이있는 데이터 프레임이 있습니다.Python Pandas GroupBy % 계산

공식 : (b를 입력의 개수)/* 100

Result : 
001 = (2/3) * 100 => 66.66 
002 = (0/2) * 100 => 0 
003 = (1/1) * 100 => 100 

(그룹의 레코드 없음) Dataframe

다음과 같이 나는 ID 레코드의 수에 b를 입력의 %를 계산하기 위해 노력하고있어
ID Type 
001 TypeA 
001 TypeB 
001 TypeB 
002 TypeA 
002 TypeA 
003 TypeB 

그래서, 지금까지 내가 팬더의 크로스 탭을 읽고 있었다

byID = df.groupby('ID') 

을 GROUPBY 할 수있었습니다 만에 보일 수 없다 100 지난 여러

답변

2

당신은 0에 의해 NaN 충전으로 unstack으로 바꿀 다음 sum에 의해 열 TypeB 나누어, 첫 번째 그룹의 카운트 길이 sizegroupby을 사용할 수있는 솔루션을 접근하는 방법을 알아낼 :

df = df.groupby(['ID','Type']).size().unstack(fill_value=0) 
print (df) 
Type TypeA TypeB 
ID     
1   1  2 
2   2  0 
3   0  1 

df1 = df.TypeB.div(df.sum(axis=1)).mul(100).reset_index(name='percentage') 
print (df1) 
    ID percentage 
0 1 66.666667 
1 2 0.000000 
2 3 100.000000 
모양 변경에 대한

는 가능한 사용 crosstab이지만, 더 큰 dataframe의 비트 slowier입니다 :

df = pd.crosstab(df.ID,df.Type) 
print (df) 
Type TypeA TypeB 
ID     
1   1  2 
2   2  0 
3   0  1 

편집 :

당신은 새 열을 추가하는 map를 사용할 수 있습니다

df1 = df.groupby(['ID','Type']).size().unstack(fill_value=0) 
print (df1) 
Type TypeA TypeB 
ID     
1   1  2 
2   2  0 
3   0  1 

df2 = df1.TypeB.div(df1.sum(axis=1)).mul(100) 
print (df2) 
ID 
1  66.666667 
2  0.000000 
3 100.000000 
dtype: float64 

df['percentage'] = df.ID.map(df2) 
print (df) 
    ID Type percentage 
0 1 TypeA 66.666667 
1 1 TypeB 66.666667 
2 1 TypeB 66.666667 
3 2 TypeA 0.000000 
4 2 TypeA 0.000000 
5 3 TypeB 100.000000 
+0

안녕하세요 @jezrael - 접근 방법을 설명해 주시겠습니까? 나는 당신이 그 해결책에 대해 어떻게 생각하는지 매우 고맙게 생각합니다. – user6083088

+0

더 좋습니까? 나는 모양을 변경 한 후에'df'의 출력을 추가합니다. – jezrael

+0

@jezrael 감사합니다. 저를 도왔습니다. 이제 어떻게하면 원래 데이터 프레임의 모든 ID에이 새로운 '백분율'열을 추가 할 수있는 방법을 찾아야합니다. 아! 당신이 어떻게 문서를 설명 할 수만 있다면. 매우 감사. – user6083088

1

사용 groupby
normalizevalue_counts(normalize=True)와 함께 자동 합계로 수를 나눕니다.

df.groupby('ID').Type.value_counts(normalize=True).unstack(fill_value=0).TypeB 

ID 
001 0.666667 
002 0.000000 
003 1.000000 
Name: TypeB, dtype: float64 
+0

감사합니다. @piRS이 또한 작동합니다. 그러나 나는 한 가지 대답만을 받아 들일 수 있습니다. – user6083088