获取按组搜索最大日期的 Pandas 计算的所有 NaT 值

Getting all NaT values for Pandas calc that searches for Max Date by Group

代码

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

我想显示每条评论的日期以及评论者的主管和身份证号码。我从重新安排中得到了一些重复项,因此我试图将此列表限制为每个 USERID_NB 的最新日期值。出于某种原因,我的最大值返回为丢失。

在这种情况下使用 groupby() returns 数据框,而不是要添加到现有数据框的列。这就是为什么您在 Max Date of Review.
中缺少值的原因 看起来你在最终输出中并不真的需要 Date of ReviewMax 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.

的情况

更新
根据 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