2017-02-19 1 views
1

객체 GROUPBY 얻기 각 특정 상태의 user_count만큼.팬더의 비율이 나는이처럼 보이는 dataframe이

나는 다음을 수행하려고 :

def f(x): 
    engaged_percent = x['engaged_count'].nunique()/x['user_count'] 
    return pd.Series({'engaged_percent': engaged_percent}) 

by = df3.groupby(['user_state']).apply(f) 
by 

를하지만 나에게 다음과 같은 결과 주었다

user_state  engaged_percent 
--------------------------------- 
California   2/21 = 0.09 
Florida    2/7 = 0.28 

I :

enter image description here

내가 원하는 것은이 같은 뭔가를 내 접근 방식이 맞다고 생각하지만 내 결과가 왜 보이는 지 모르겠습니다. p 두 번째 그림에서 본 것과 같습니다.

도움이 될 것입니다. 미리 감사드립니다!

+0

데이터 프레임에 복제 된 레코드가 너무 많습니다. 이는 의도적 인 것입니다. 그리고 또한 이미지를 게시하지 마십시오? 일반 복사 및 붙여 넣기 만하면 다른 사람들이 쉽게 테스트 할 수 있습니다. – Psidom

답변

2

에 대해 어떻게 :

user_count=df3.groupby('user_state')['user_count'].mean() 
#(or however you think a value for each state should be calculated) 

engaged_unique=df3.groupby('user_state')['engaged_count'].nunique() 

engaged_pct=engaged_unique/user_count 

(당신은 또한에 한 줄에서이 작업을 수행 할 수 다른 방법으로 잔뜩)

원래의 솔루션은 전체 값을 user count 시리즈로 나눈 것을 제외하고는 거의 괜찮 았습니다. 그래서 당신은 가치 대신 시리즈를 얻고있었습니다. 이 작은 변형을 시도해 볼 수 있습니다.

def f(x): 
    engaged_percent = x['engaged_count'].nunique()/x['user_count'].mean() 
    return engaged_percent 

by = df3.groupby(['user_state']).apply(f) 
by 
1

난 그냥 사용하는 것이 groupbyapply 직접

df3['engaged_percent'] = df3.groupby('user_state') 
          .apply(lambda s: s.engaged_count.nunique()/s.user_count).values 

데모

>>> df3 
    engaged_count user_count user_state 
0    3   21 California 
1    3   21 California 
2    3   21 California 
... 
19    4   7  Florida 
20    4   7  Florida 
21    4   7  Florida 

>>> df3['engaged_percent'] = df3.groupby('user_state').apply(lambda s: s.engaged_count.nunique()/s.user_count).values 

>>> df3 
    engaged_count user_count user_state engaged_percent 
0    3   21 California   0.095238 
1    3   21 California   0.095238 
2    3   21 California   0.095238 
... 
19    4   7  Florida   0.285714 
20    4   7  Florida   0.285714 
21    4   7  Florida   0.285714 
관련 문제