2017-09-07 9 views
1

ソリューションの恩恵を受けるで尋ねられたデータフレームに別のgreat questionがあります。ここに質問があります。パンダのグループ化とカウントダウン

は私がcountryごとstatusopenする回数とstatusclosedする回数をカウントします。次に closeratecountryと計算します。

データ:

customer country closeday status 
1  1  BE 2017-08-23 closed 
2  2  NL 2017-08-05 open 
3  3  NL 2017-08-22 closed 
4  4  NL 2017-08-26 closed 
5  5  BE 2017-08-25 closed 
6  6  NL 2017-08-13 open 
7  7  BE 2017-08-30 closed 
8  8  BE 2017-08-05 open 
9  9  NL 2017-08-23 closed 

アイデアはopenclosed状態の数、およびclose_ratioを描いた出力を得ることです。これは望ましい出力です:

country closed open closed_ratio       
BE   3  1   0.75 
NL   3  2   0.60 

お待ちしております。

解決策は以下のとおりです。他のソリューションへようこそ。

答えて

3

のは

1いくつかの方法があります)

In [420]: (df.groupby(['country', 'status']).size().unstack() 
      .assign(closed_ratio=lambda x: x.closed/x.sum(1))) 
Out[420]: 
status closed open closed_ratio 
country 
BE   3  1   0.75 
NL   3  2   0.60 

2)

piRSquared

In [430]: (df.set_index('country').status.str.get_dummies().sum(level=0) 
      .assign(closed_ratio=lambda x: x.closed/x.sum(1))) 
Out[430]: 
     closed open closed_ratio 
country 
BE   3  1   0.75 
NL   3  2   0.60 
から借用
In [422]: (pd.crosstab(df.country, df.status) 
      .assign(closed_ratio=lambda x: x.closed/x.sum(1))) 
Out[422]: 
status closed open closed_ratio 
country 
BE   3  1   0.75 
NL   3  2   0.60 

3)

In [424]: (df.pivot_table(index='country', columns='status', aggfunc='size') 
      .assign(closed_ratio=lambda x: x.closed/x.sum(1))) 
Out[424]: 
status closed open closed_ratio 
country 
BE   3  1   0.75 
NL   3  2   0.60 

4)

1
df 

    customer country closeday status 
1   1  BE 2017-08-23 closed 
2   2  NL 2017-08-05 open 
3   3  NL 2017-08-22 closed 
4   4  NL 2017-08-26 closed 
5   5  BE 2017-08-25 closed 
6   6  NL 2017-08-13 open 
7   7  BE 2017-08-30 closed 
8   8  BE 2017-08-05 open 
9   9  NL 2017-08-23 closed 

groupbyを適用し、そしてsize、次いでunstack最初のレベルで各グループを数えます。

df2 = df.groupby(['country', 'status']).status.size().unstack(level=1) 
df2 

status closed open 
country    
BE   3  1 
NL   3  2 

さて、closed_ratioを計算します。ここでは

df2['closed_ratio'] = df2.closed/df2.sum(1)  
df2 

status closed open closed_ratio 
country        
BE   3  1   0.75 
NL   3  2   0.60 
関連する問題