Векторизируйте функцию итерации, которая удаляет повторяющиеся значения, сохраняя только первые

#python #pandas #dataframe

Вопрос:

У меня есть сценарий, который использует итерации, и я прочитал, что это неэффективный метод, и хотел бы уточнить свой код. Но, прочитав другие вопросы по этой теме, я не нашел ответа на свой конкретный пример. Я законченный программист-любитель, поэтому был бы признателен за любую помощь в улучшении.

Я просто хочу удалить дубликаты в серии, оставив только первый и оставив пробелы для последующих строк с тем же временем. Я сохраняю время первой строки, несмотря ни на что, поэтому я начинаю со сравнения второго значения.

 def clean_times(df):

    time = df.iloc[1]['Result']  # initilize to the first time gap
    if ':' in time:
        for index, row in df.iterrows():
            if index > 1:
                if row['Result'] == time:
                    df.loc[index, 'Result'] = ''
                else:
                    time = row['Result']
    return df
    time = ''
 
 x = [{'Result':'4:51:36'},{'Result':'0:01:27'},{'Result':'0:02:19'},{'Result':'0:02:42'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:02:57'},{'Result':'0:03:03'},{'Result':'0:03:03'},{'Result':'0:03:23'},{'Result':'0:03:23'},{'Result':'0:03:23'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:03:57'},{'Result':'0:04:02'},{'Result':'0:04:15'},{'Result':'0:04:15'},{'Result':'0:04:25'},{'Result':'0:04:25'},{'Result':'0:04:25'}]
df = pd.DataFrame(x)
df1 = clean_times(df)
 

Результат

 Result
0   4:51:36
1   0:01:27
2   0:02:19
3   0:02:42
4   0:02:57
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  0:03:03
19  
20  0:03:23
21  
22  
23  0:03:57
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  0:04:02
34  0:04:15
35  
36  0:04:25
37  
38  
 

Ответ №1:

Просто используйте mask с условием в следующей (сдвинутой) строке:

 df['Result'] = df['Result'].mask(df['Result']==df['Result'].shift(), '')
 

выход:

      Result
0   4:51:36
1   0:01:27
2   0:02:19
3   0:02:42
4   0:02:57
5          
6          
7          
8          
9          
10         
11         
12         
13         
14         
15         
16         
17         
18  0:03:03
19         
20  0:03:23
21         
22         
23  0:03:57
24         
25         
26         
27         
28         
29         
30         
31         
32         
33  0:04:02
34  0:04:15
35         
36  0:04:25
37         
38         
 

Комментарии:

1. Вау, так намного проще, чем мой запутанный способ! Спасибо!