2017-08-17 48 views
0

我有一個數據框,我想根據顏色和價格找到重複項。然後使用最近(基於日期)行的代碼更改代碼。我不希望任何行被刪除。 數據幀是這樣的:熊貓:找到重複項並根據日期對其進行修改

id Color Price Code  Date 
1 White 1.50  111 3-22-2017 12:00 
2 Green 2.20  222 3-23-2017 09:55 
3 Black 3.00  333 3-24-2017 11:45 
4 White 1.50  111 3-23-2017 10:20 
5 White 1.50  444 3-23-2017 08:15 
6 Green 2.20  555 3-25-2017 07:05 

的結果應該是這樣的:

id Color Price Code  Date 
    1 White 1.50  111 3-22-2017 12:00 
    2 Green 2.20  **555** 3-23-2017 09:55 
    3 Black 3.00  333 3-24-2017 11:45 
    4 White 1.50  111 3-23-2017 10:20 
    5 White 1.50  **111** 3-23-2017 08:15 
    6 Green 2.20  555 3-25-2017 07:05 

我知道答案是接近的答案here但日期的形式混淆了我。

+1

我想需要'111'而不是'444',因爲更多的發送日期是'3-23-2017 10:20','白色,1.5'組 – jezrael

+0

@jezrael同比 對。我改變了它。 – nesi

回答

2

我認爲你需要sort_valuesGroupBy.transform和功能last

#if not datetime, convert it 
df['Date'] = pd.to_datetime(df['Date']) 

df['Code'] = df.sort_values('Date').groupby(['Color', 'Price'])['Code'].transform('last') 
print (df) 
    id Color Price Code    Date 
0 1 White 1.5 111 2017-03-22 12:00:00 
1 2 Green 2.2 555 2017-03-23 09:55:00 
2 3 Black 3.0 333 2017-03-24 11:45:00 
3 4 White 1.5 111 2017-03-23 10:20:00 
4 5 White 1.5 111 2017-03-23 08:15:00 
5 6 Green 2.2 555 2017-03-25 07:05:00 
3

嘗試使用df.groupby隨後dfGroupBy.transform挑選的最後一個值:

In [406]: df.Code = df.sort_values('Date')\ 
         .groupby(['Color', 'Price']).Code.transform('last') # faster than lambda 

In [407]: df 
Out[407]: 
    id Color Price Code    Date 
0 1 White 1.5 111 3-22-2017 12:00 
4 5 White 1.5 111 3-23-2017 08:15 
1 2 Green 2.2 555 3-23-2017 09:55 
3 4 White 1.5 111 3-23-2017 10:20 
2 3 Black 3.0 333 3-24-2017 11:45 
5 6 Green 2.2 555 3-25-2017 07:05 

確保您的數據幀由Date排序,通過調用df.sort_values第一。

此外,正如jezrael指出的,我認爲你的預期產出是不正確的。要獲得正確的輸出,您必須確保Date的類型爲pd.datetime。如果不是,則轉換它。

2

爲了完整,這裏是一個不需要按日期排序的解決方案。 您可以通過

key = [df.Color, df.Price]; 
most_recent = df.groupby(key).Date.transform(max) 

獲得最新的每一行對應一個顏色,價格對然後做

code = df.Code.where(df.Date == most_recent).groupby(key).transform(max) 
+0

2'groupby'操作不是一個好主意。 –

+0

我認爲將'lambda'傳遞給'transform'不是一個好主意。即使數據已按日期排序,該解決方案速度也提高了2倍。我選擇瞭解決方案,以便數據不按日期排序。 – JoeCondron

+0

我同意'last'比較快。將編輯。 –