2017-10-22 7 views
1

私はPythonで、次のplyrチェーンを実装しようとしてきた:私はpythonでここまで来たしかしPythonで(より複雑な)R plyrチェーンを実装する方法は?

# Data 
data_L1 

X Y r2 contact_id acknowledge_issues 
a c 100 xyzx  0 
b d 100 fsdjkfl 0 
a c 80 ejrkl  20 
b d 60 fdsdl  40 
b d 80 gsdkf  20 

# Transformation 
test <- ddply(data_L1, 
       .(X,Y), 
       summarize, 
       avg_r2 = mean(r2), 
       tickets = length(unique(contact_id)), 
       er_ai =length(acknowledge_issues[which(acknowledge_issues>0)])/length(acknowledge_issues) 
      ) 

# Output 
test 

X Y avg_r2 tickets er_ai 
a c 90  2  0.5 
b d 80  3  0.6667 

を:

test = data_L1.groupby(['X','Y']).agg({'r2': 'mean', 'contact_id' : 'count'}) 

私は、変数を作成する方法を見つけ出すことはできませんPythonでer_ai。パンダや他の図書館のソリューションの提案はありますか?

+1

必要ですAGG({ 'r2': 'mean'、 'contact_id': 'nunique'、 'acknowledge_issues':ラムダx:(x> 0).mean()}) '? – jezrael

+0

'test = test.rename(columns = {'r2': 'avg_r2'、 'contact_id': 'チケット'、 'acknowledge_issues': 'er_ai'})'? – jezrael

+0

編集中!私が必要とするer_aiのために:> 0のエントリ数をカウントし、すべてのエントリ数で除算してください – maxtenzin

答えて

3

利用代わりcount機能nuniqueer_aiのためには、条件によってすべての値のmeanを取得:あなたは `テスト= data_L1.groupby([ 'X'、 'Y'])

cols = {'r2':'avg_r2', 'contact_id':'tickets', 'acknowledge_issues':'er_ai'} 
test = (data_L1.groupby(['X','Y'], as_index=False) 
       .agg({'r2': 'mean', 
        'contact_id' : 'nunique', 
        'acknowledge_issues': lambda x: (x>0).mean()}) 
       .rename(columns=cols)) 
print (test) 
    X Y tickets  er_ai avg_r2 
0 a c  2 0.500000  90 
1 b d  3 0.666667  80 
+0

これは感謝します!なぜ '(x> 0).mean()'が '' length(acknowledge_issues [which(acknowledge_issues> 0)])/ length(acknowledge_issues) 'を作るのですか? – maxtenzin

+0

フィルタ 'x> 0'が' True + False'の出力を出力するためです。すべてのTruを取得するには '(x> 0).sum()'が必要なので、 '(x> 0).sum()/ len(x)'は '(x> 0).mean() 'と同じです。 – jezrael

+0

awesome !!どうもありがとう!! – maxtenzin

関連する問題