2016-11-02 92 views
1

我有一個很大的數據集,我使用的是一個id號作爲索引。在開始處理之前,我需要處理一些出現的重複ID,但需要根據多個條件完成 - 實質上,我希望每個ID的所有重複條目都有條目。在多個標準下刪除重複的熊貓指數

在這個例子中,我可能會首先希望它採用最近一年的重複 - 這將使id 1唯一。但ID爲3仍然有剩下的兩個值,所以後來我想它去到下一個條件 - 在這種情況下,我們會說最大VAL:

import pandas as pd 
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]} 
df = pd.DataFrame(data).set_index('id') 

dups = df[df.index.duplicated(keep=False)] 

for id in dups.index.unique(): 
    current = dups.loc[id] 
    max_yr = current['year'].max() 
    #continue to process using multiple conditionals inside the loop 

如果結果是這樣的:

val year 
id 
1  7 2001 
1  8 2002 
2  9 2002 
3 17 2001 
3 11 2002 
3 12 2002 

打開此:

val year 
id 
1  8 2002 
2  9 2002 
3 12 2002 

它的工作原理,但它的效率非常低,我覺得必須有一個量化的,或者至少更好的方式來做到這一點。 groupby可以被合併,但我仍然不確定如何在沒有循環訪問組的情況下做到這一點。

+0

你是在:'df.groupby(level = 0).max()'? – MaxU

+0

不,它需要考慮多個標準,以避免重複丟棄,爲每個ID留下一個*最佳*條目。 – Jeff

回答

1

這個想法是添加一個複合列,它將完全確定最佳匹配。例如,如果第一個標準是max(year),第二個標準是max(val),則可以將它們組合到tuple中並獲取該列的最大值。如果某個標準是min(X),那麼您可以將-X添加到元組中。 (tuples are compared element by element

import pandas as pd 
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]} 
df = pd.DataFrame(data).set_index('id') 
df['year_val'] = df.apply(lambda row: (row.year, row.val), axis=1) 
df.reset_index().groupby('id').apply(
    lambda df: df[df['year_val'] == df['year_val'].max()]).drop(
    ['year_val'], axis=1).set_index('id') 

    val year 
id   
1  8 2002 
2  9 2002 
3 12 2002   
+0

哦,元組技巧對此非常完美。謝謝,我沒有意識到這一般的Python功能。 – Jeff

+0

@JeffL。很高興幫助! –