在這種情況下使用groupby()
會返回一個數據幀,而不是要添加到現有數據幀的列。這就是爲什麼你在Max Date of Review
中缺少值。
在你的最終輸出中,你似乎並不需要Date of Review
和Max Date of Review
。
此外,'max'
就足夠作爲agg()
函數,您不需要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()
來實現自己的目標,這將工作:
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
注意,rename()
在到底是不是絕對必要的,只有在您確實想要將Date of Review
列重命名爲Max Date of Review
時纔有效。
UPDATE
每OP評論,這裏是一個包含匹配的max
Date of Review
的Technical Director
領域的版本。請注意,SQL having
語法can sometimes be mimicked with filter()
,但它並不總是一個直接類似的操作,並且通常需要多個groupby
操作。
這裏我用merge()
代替,它與原始數據幀中的Technical Director
值和groupby
輸出的最大日期行相匹配。示例數據現在包含每UserID_NB
不同的Technical Director
值,以說明此更新。
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
可以proviide最小(可複製)輸入,顯示這種行爲(見[MCVE])? – MSeifert
如果我正確地遵循這個問題,你需要一個複製問題的數據集,對嗎? – mdl003
確切地說:)不需要是你的數據集,只是可以用來獲得類似(有問題的)結果的東西。 – MSeifert