获取按组搜索最大日期的 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 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
.
的情况
更新
根据 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
代码
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 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
.
更新
根据 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