在这种情况下使用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