2014-07-09 2 views
5

DataFrame에 실제 값만 포함하는 상상해를 갖고 있다고 가정 해보십시오.Groupby 선택한 DataFrame 열 값의 백분위 수

>> df   
      col1 col2  col3 
0  0.907609  82 4.207991 
1  3.743659 1523 6.488842 
2  2.358696 324 5.092592 
3  0.006793  0 0.000000 
4 19.319746 11969 7.405685 

내가 분위수 (또는 날에 의해 지정된 다른 백분위) 선택된 항목의 그룹화 그것을 원하는 (예를 들어, col1)이 그룹에 어떤 동작을 수행한다. 이상적으로, 내가 좋아하는 일을하고 싶습니다 :

df.groupy(quartiles_of_col1).mean() # not working, how to code quartiles_of_col1? 

출력은 col1의 분위에 해당하는 네 개의 그룹에 대한 열의 각각의 평균을 제공해야합니다. 이 명령은 groupby 명령으로 가능합니까? 그것을 달성하는 가장 간단한 방법은 무엇입니까?

답변

7

을 인쇄 할 것은 내가 지금 그것을 테스트 할 수있는 컴퓨터가없는 작동 희망,하지만 난 당신이 그것을 할 수 있다고 생각 : df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]), include_lowest=True)).mean(). 150 분 후에 업데이트됩니다.

일부 설명 :

In [42]: 
#use np.percentile to get the bin edges of any percentile you want 
np.percentile(df.col0, [0, 25, 75, 90, 100]) 
Out[42]: 
[0.0067930000000000004, 
0.907609, 
3.7436589999999996, 
13.089311200000001, 
19.319745999999999] 
In [43]: 
#Need to use include_lowest=True 
print df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]), include_lowest=True)).mean() 
         col0  col1  col2 
col0           
[0.00679, 0.908] 0.457201  41.0 2.103996 
(0.908, 3.744]  3.051177 923.5 5.790717 
(3.744, 13.0893]  NaN  NaN  NaN 
(13.0893, 19.32] 19.319746 11969.0 7.405685 
In [44]: 
#Or the smallest values will be skiped 
print df.groupby(pd.cut(df.col0, np.percentile(df.col0, [0, 25, 75, 90, 100]))).mean() 
         col0  col1  col2 
col0           
(0.00679, 0.908] 0.907609  82.0 4.207991 
(0.908, 3.744]  3.051177 923.5 5.790717 
(3.744, 13.0893]  NaN  NaN  NaN 
(13.0893, 19.32] 19.319746 11969.0 7.405685 
+2

이 작품은 나를 위해! 컷의 화려한 사용! 감사합니다 챔피언 – biobirdman

+1

예제가 추가되었습니다. 또한'include_lowest'를'True'로 설정하려고합니다. 그렇지 않으면 가장 작은 숫자는 건너 뜁니다. 편집 됨. 건배! –

0

문제가 해결되기를 바랍니다. 그것은 꽤하지 않습니다하지만 난 당신이

import pandas as pd 
    import random 
    import numpy as np 
    ## create a mock df as example. with column A, B, C and D 
    df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

    ## select dataframe based on the quantile of column A, using the quantile method. 
    df[df['A'] < df['A'].quantile(0.3)].mean() 

A -1.157615 
B 0.205529 
C -0.108263 
D 0.346752 
dtype: float64 
+0

음,이 하나의 백분위 수에 대한 확인하지만, 내가 특별히 찾고 있어요 백분위 수/q- 분위수에 의해 정의 된 각 그룹에 대해 "평균"을 얻을 수있는 솔루션이 필요합니다. – pms

+0

quantile 값을 대체하는 for 루프를 수행하는 것은 어떻습니까? – biobirdman

+0

예, 가능하지만 우아하고 효율적이지 않습니다. 당신이 큰 DF를 가지고 있고 그것을 10-cuantiles로 나누고 싶다고 상상해보십시오. 루프를 실행하면 데이터를 그룹화하기 위해 DF를 10 번 사용하게됩니다. – pms