2016-07-31 16 views
2

多次元ルックアップを実行して、新しい列に値を代入しています。マルチキーパンダのデータフレームに関数を適用する方法

私は月ごとに履歴従業員のデータを持つテーブルを持っています。この例ではの2人のユニークユーザーがあり、1か月以内に複数のジョブを持つことができます。

以下の条件に基づいて、それぞれのユニークユーザーに適格なジョブがあるかどうかを知らせる新しい列を作成します。課題は、各行を月/年ごとに考慮する必要があることです。

import pandas as pd 
import numpy as np 

data = {'Month': ["January", "January", "January", "February", "February", "February", "March", "March", "March", "March"], 
     'Year': [2015,2015,2015,2015,2015,2015,2016,2016,2016,2016], 
     'Job #': [1,1,2,1,2,1,1,1,2,3], 
     'Pay Group': ["Excluded","Included","Excluded","Excluded","Included","Included","Excluded","Exclcuded","Excluded","Included"], 
     'Name': ["John","Bill","Bill","John","John","Bill","John","Bill","Bill","Bill"]} 
df = pd.DataFrame(data, columns=['Month', 'Year', 'Job #', 'Pay Group', 'Name']) 

df 

対象ジョブズ条件:

  • (= 1 Job #Pay Group =含める)場合は事前条件が偽であれば、与えられたmonth/yearPay Group =含ま内の次の最大のJob #を探します

Output

答えて

0

IIUC:

あなたは毎月1回/年以内に、Pay Group == Includedのような最小の仕事番号を取得したいと考えています。

含まれているものだけをフィルタリングします。ジョブ#でソートします。最低観測所の指標を取る年、月、および名前でグループ化する。これを使用して新しい列を割り当てます。

dfi = df[df['Pay Group'] == 'Included'].sort_values('Job #') 
gc = ['Year', 'Month', 'Name'] 
idx = dfi.groupby(gc, as_index=False)['Job #'].idxmin() 
df['Eligible Job'] = 'Not Eligible' 
df.ix[idx] = 'Eligible' 

df 

enter image description here

+0

おかげpiRSquared。これはすばらしかった。これにはもう1つの部分があります...これらを適格なジョブとしてフラグを立てる新しい列を作成するには、これが必要です。 '適格業務':「対象」/「対象外」。 また、これを実行した後、groupbyをリセットして、フルテーブルに戻ることができますか? – Christopher

+0

@Christopher投稿が更新されました。 – piRSquared

+0

がほとんどあります。コードが「対象」の元の行を上回るように見えます。私は元のテーブルを保持するために探していますが、 "対象ジョブ"の列= "対象"または "対象外"のみです。 – Christopher

関連する問題