2017-04-24 4 views
0

グループ

reviewer_map['Max Date of Review'] = reviewer_map.groupby('UserID_NB').agg({'Date of Review': [np.max]}) 

dtypes

UserID_NB      object 
Technical Director   object 
Date of Review  datetime64[ns] 
Max Date of Review datetime64[ns] 

出力は、私が表示したい

UserID_NB  Technical Director  Date of Review  Max Date of Review 
FRANK1   Frank     2017-04-20   NaT 
JOHN2   John     2017-04-20   NaT 

のように見えます

コードで最大日付を検索パンダのcalcのためのすべてのNATの値を取得します各レビューの日付と、レビューアのディレクターとID番号が表示されます。私はリスケジュールからいくつかの重複を持っていますので、このリストをそれぞれの最新の日付値に制限しようとしていますUSERID_NB。なんらかの理由で、私の最大値が戻ってきています。

+0

あなたは([MCVE]を参照)、この動作を示し、最小(コピー可能)入力をproviideことができますか? – MSeifert

+0

これを正しく実行している場合、問題を再現するデータセットを要求していますが、正しいですか? – mdl003

+0

正確::)あなたのデータセットである必要はありません。同様の(問題のある)結果を得るために使用できるものです。 – MSeifert

答えて

1

この場合、groupby()を使用すると、既存のデータフレームに追加する列ではなく、データフレームが返されます。だからこそ、あなたはMax Date of Reviewに値がありませんでした。
最終出力にはDate of ReviewMax Date of Reviewの両方が本当に必要ないようです。
さらに、agg()関数では'max'で十分です。np.maxは不要で、リストにラップする必要はありません。

基本的にはすでに基本的には問題を解決していますが、いくつかの構文上の問題はありません。まっすぐにセットするのは簡単です。

まず、ここではいくつかのサンプルデータです:

dates = pd.date_range('20170101', periods=6, freq='D') 
uid = ['FRANK1','JOHN2','FRANK1','JOHN2','FRANK1','FRANK1'] 
name = ['Frank','John','Frank','JohnABC','Frank','Frank123'] 
reviewer_map = pd.DataFrame({'UserID_NB':uid, 
          'Technical Director':name, 
          'Date of Review':dates}) 

print(reviewer_map) 
    Date of Review Technical Director UserID_NB 
0  2017-01-01    Frank FRANK1 
1  2017-01-02    John  JOHN2 
2  2017-01-03    Frank FRANK1 
3  2017-01-04   JohnABC  JOHN2 
4  2017-01-05    Frank FRANK1 
5  2017-01-06   Frank123 FRANK1 

あなたがあなたの目標を達成するためにgroupby()を使用する場合、これは動作します:最後にrename()ではないこと

print(reviewer_map.groupby('UserID_NB', as_index=False) 
        .agg({'Date of Review': 'max'}) 
        .rename(columns={'Date of Review':'Max Date of Review'})) 

    UserID_NB Max Date of Review 
0 FRANK1   2017-01-06 
1  JOHN2   2017-01-04 

注意厳密に必要なのは、Date of Review列の名前を実際にMax Date of Reviewと変更する場合のみです。

UPDATE
毎のOPのコメントは、ここmaxDate of Review一致するTechnical Directorフィールドを含むバージョンです。 SQL havingの構文はcan sometimes be mimicked with filter()であることに注意してください。ただし、それは必ずしも直接的に類似した操作ではなく、多くの場合、複数の操作が必要です。

代わりにmerge()を使用しました。元のデータフレームのTechnical Directorの値とgroupby出力の最大日付行の値が一致します。このアップデートを説明するために、今例のデータにTechnical Directorの値がUserID_NBごとに含まれています。

df = (reviewer_map.groupby('UserID_NB', as_index=False) 
       .agg({'Date of Review': 'max'})) 
df.merge(reviewer_map, 
     on=['UserID_NB','Date of Review'], 
     how='left') 

出力:

UserID_NB Date of Review Technical Director 
0 FRANK1  2017-01-06   Frank123 
1  JOHN2  2017-01-04   JohnABC 
+0

これはすばらしいです、ありがとう。私がMax Date of Reviewを自分のアウトプットに入れたいのであれば(私は、レビューの日付=レビューの最大の日付を保持したいだけです)どうすればいいですか? – mdl003

+0

よろしくお願いします!私はここであなたの質問を理解しているか分からない。 'Max Date of Review' *は出力です - ' agg() 'は' Date of Review == Max Date of Review'のエントリのみを返します。出力例を参照 - 各UserID_NBの最大日付のみが返されます。 –

+0

私はあなたが言っているものを手に入れます。私の例では、テクニカルディレクターとuserID_nbが必ずしも同じではないので、私はuserID_nb(私の悪い)でグループ化していました。私は、SQL ITDでこれを行わたい場合レビュー – mdl003