2017-01-19 6 views
3

私がDFを持っている:は、最高のパフォーマンスで列の異なるメンバー間の比率をゲット

ClientHostID LoginDaysSum 
0 70 4 
1 70 2 
2 71 11 
3 71 2 
4 79 37 
5 79 1 
6 79 1 
7 80 18 
8 80 6 
9 87 29 
10 87 1 
11 88 88 
12 88 2 
13 88 1 
14 88 1 
15 88 1 
16 88 1 

ソートされている:すべてのClientHostIDはとの比率を取得するために私が欲しいもの

local_input_list.sort_values(['ClientHostID', 'LoginDaysSum'], ascending=[True, False], inplace=True) 

があります彼の最大の二LoginDaysSumに彼の最大のLoginDaysSum(結果は次のようになります):

ClientHostID ratio 
0 70 2 
1 71 5.5 
2 79 37 
3 80 3 
4 87 29 
5 88 22 

私はそれを得るために管理します。

df = df.groupby(['ClientHostID'], sort=False)['LoginDaysSum'].apply(lambda x: x.iloc[0]/x.iloc[1]).reset_index(name='ratio') 

しかし、漁獲量が適用されます使用している...パフォーマンスに

重すぎる私のような何かを考えた:私はこれをしようとすると、私はすべてのように上のエラーを取得

largest = df.groupby(['ClientHostID']).first() 
drop_largest = df.drop(largest) 
second_largest = drop_largest.groupby(['ClientHostID']).first() 
df['ratio'] = largest['LoginDaysSum']/second_largest['LoginDaysSum'] 

これは私が達成しようとしていることの一般的な雰囲気を得るために完全に擬似です。

私は、 ありがとう、任意の入力をお願い申し上げます

+1

を。エドの答えは正しい比率を示しています。 –

答えて

3

あなたはあなたの最初のDFを切ることができるの関心のほんのトップ2行それはソートして、次の操作を行いますので、へ:次に

In [136]: 
stripped = df.groupby('ClientHostID').head(2) 
stripped 

Out[136]: 
    ClientHostID LoginDaysSum 
0    70    4 
1    70    2 
2    71   11 
3    71    2 
4    79   37 
5    79    1 
7    80   18 
8    80    6 
9    87   29 
10   87    1 
11   88   88 
12   88    2 

groupby減少DF上とfirstlastだけdiv

In [138]: stripped.groupby('ClientHostID').first().div(stripped.groupby('ClientHostID').last()) 
Out[138]: 
       LoginDaysSum 
ClientHostID    
70      2.0 
71      5.5 
79     37.0 
80      3.0 
87     29.0 
88     44.0 

あなたは、その後、所望の出力を得るためにrenamereset_indexとチェーンコールを呼び出すことができます:ところで、あなたはあなたの期待出力にはいくつかのタイプミスがあり

In [140]: 
stripped.groupby('ClientHostID').first().div(stripped.groupby('ClientHostID').last()).reset_index().rename(columns={'LoginDaysSum':'ratio'}) 

Out[140]: 
    ClientHostID ratio 
0   70 2.0 
1   71 5.5 
2   79 37.0 
3   80 3.0 
4   87 29.0 
5   88 44.0 
関連する問題