2017-04-24 88 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