누계

2013-10-07 7 views
1

가정하자 I는 다음 셋과 같다누계

df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
      'count' : [8, 3, 2, 2, 8, 7] }) 
df = pd.DataFrame(df_dict) 

df.set_index('unit', inplace = True) 

가지고

cat count 
unit   
1 1 8 
1 2 3 
1 3 2 
2 1 2 
2 2 8 
2 4 7 

카운트 주파수 제공을하는 유닛 관찰 다른 카테고리. 내가 얻고 자하는 것은 각 단위에 대한 네 가지 범주의 누적 빈도입니다.

[8/13, 11/13, 13/13, 13/13] 

부 2 : 2

따라서 유닛으로부터 누락되었음을 카테고리 4 (1) 및 카테고리 3에서 누락 참고 최종 결과는 부 1

[2/17, 10/17, 10/17, 17/17] 

나는 groupbycumsum에 누적 합계를 얻기 위해,하지만 장치 (1)는, 예를 들어, 누락 된 범주에 대한 값이없는 방법을 알고 4.

감사합니다.

답변

2
import pandas as pd 


df_dict = ({'unit' : [1, 1, 1, 2, 2, 2], 'cat' : [1, 2, 3, 1, 2, 4], 
      'count' : [8, 3, 2, 2, 8, 7] }) 
df = pd.DataFrame(df_dict) 

df.set_index('unit', inplace = True)  

cumsum_count = df.groupby(level=0).apply(lambda x: pd.Series(x['count'].cumsum().values, index=x['cat'])) 
# unit cat 
# 1  1  8 
#  2  11 
#  3  13 
# 2  1  2 
#  2  10 
#  4  17 
# dtype: int64 

cumsum_count = cumsum_count.unstack(level=1).fillna(method='ffill', axis=1) 
# cat 1 2 3 4 
# unit    
# 1  8 11 13 13 
# 2  2 10 10 17 

totals = df.groupby(level=0)['count'].sum() 
# unit 
# 1  13 
# 2  17 
# Name: count, dtype: int64 

cumsum_dist = cumsum_count.div(totals, axis=0) 
print(cumsum_dist) 


난 정말이 솔루션을 설명하는 방법을 모른다

cat   1   2   3 4 
unit         
1  0.615385 0.846154 1.000000 1 
2  0.117647 0.588235 0.588235 1 
를 산출 - 나는 다소 serendipidously 그것을 도착 아마도 때문이다. 영감 는 Jeff's solution에서 온 인덱스와 값을 연결하는
s.apply(lambda x: pd.Series(1, index=x)) 

을 사용한다. 누적 횟수 ( )를 연결하면 [0122], [8,11,13], cat 숫자 ( 인덱스). [1,2,3], 당신은 기본적으로 집이 없습니다. 나머지는 unstack, fillna, divgroupby의 표준 응용 프로그램입니다.

+0

감사합니다. 정말 멋진 솔루션입니다! 나는 여전히 인덱스와 관련된 값에 대해 머리 글자를 써야한다 ... 빠른 질문 하나 :'cumsum(). values'에서'.values ​​'를 사용해야하는 이유는 무엇입니까? 나는 그 일을하는 것을 얻지 못한다. – cd98

+1

'lambda' 함수 안에서'x'는 DataFrame입니다. 'x [ 'count']. cumsum()'은 시리즈입니다. 그 시리즈에는'x [ 'cat']'로 대체하고 싶은 인덱스가 있습니다. 원래 시리즈에 중복이 있기 때문에'pd.Series (x [ 'count']. cumsum(), index = x [ 'cat'])''를 사용하면 'ValueError : can not reindex ...'예외가 발생합니다. 그 인덱스에있는 엔트리 - 이전 인덱스에서 새 인덱스로 매핑하는 방법이 불분명합니다. 모든 시리즈에는 기본 데이터를 NumPy 배열로 반환하는'values' 속성이 있습니다. 우리가 신경 쓰는 것은 원래 색인이 아닌 데이터입니다. 따라서'.values'를 사용하여 데이터를 선택했습니다. – unutbu

+0

감사합니다. – cd98

관련 문제