2017-04-24 89 views
0
集团

代码获取大熊猫计算,通过

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 

我想展现的最大日期搜索所有的NAT值每次审核的日期以及审核人的主管和身份证号码。我有一些来自重新计划的重复项,所以我试图将这个列表限制为每个USERID_NB的最新日期值。出于某种原因,我的最大值将会丢失。

+0

可以proviide最小(可复制)输入,显示这种行为(见[MCVE])? – MSeifert

+0

如果我正确地遵循这个问题,你需要一个复制问题的数据集,对吗? – mdl003

+0

确切地说:)不需要是你的数据集,只是可以用来获得类似(有问题的)结果的东西。 – MSeifert

回答

1

在这种情况下使用groupby()会返回一个数据帧,而不是要添加到现有数据帧的列。这就是为什么你在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时才有效。

UPDATE
每OP评论,这里是一个包含匹配的maxDate of ReviewTechnical 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 
+0

这很好,谢谢。如果我确实希望在我的输出中使用Max Date of Review(我只希望将这些条目保留在审阅日期=最大审阅日期)那么我该怎么做? – mdl003

+0

不客气!不知道我在这里理解你的问题。 'Max Date of Review' *是输出 - 这里'agg()'只返回那些'评论日期==评论日期最大值'的条目。查看示例输出 - 仅返回每个“UserID_NB”的最大日期。 –

+0

我明白你的意思。我的示例省略了技术总监和userID_nb并不总是相同的,这就是为什么我通过userID_nb(我的坏)进行分组的原因。 我的理想输出设定会是什么样子:回顾 – mdl003