この場合、groupby()
を使用すると、既存のデータフレームに追加する列ではなく、データフレームが返されます。だからこそ、あなたはMax Date of Review
に値がありませんでした。
最終出力にはDate of Review
とMax 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のコメントは、ここmax
Date 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
あなたは([MCVE]を参照)、この動作を示し、最小(コピー可能)入力をproviideことができますか? – MSeifert
これを正しく実行している場合、問題を再現するデータセットを要求していますが、正しいですか? – mdl003
正確::)あなたのデータセットである必要はありません。同様の(問題のある)結果を得るために使用できるものです。 – MSeifert