Как условно удалить дубликаты из Pandas DataFrame со списком - PullRequest
4 голосов
/ 22 марта 2020

У меня есть df, и я хочу удалить все дубликаты на ID.

       Name     Symbol         ID
0   ZOO INC     Remove  88579Y101
1   Zoo Inc        ZZZ  88579Y101
2     A Inc        AAA  90138A103
3     a inc.    Remove  90138A103
4    2U Inc       TWUO  90214J101
5      Keep     Remove  111111111

Но я хочу удалить только дублирующиеся строки, где Symbol == 'Remove'. Вывод должен выглядеть следующим образом:

       Name     Symbol         ID
0   Zoo Inc        ZZZ  88579Y101
1     A Inc        AAA  90138A103
2    2U Inc       TWUO  90214J101
3      Keep     Remove  111111111

Я не могу использовать result_df = df.drop_duplicates(subset=['ID'], keep='first') (или keep='last'), потому что набор данных не имеет определенного шаблона c. И сортировка по алфавиту сначала не поможет.

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

Поддерживает ли Pandas что-то вроде: result_df = df.drop_duplicates(subset=['ID'], keep=(df['Symbol'] != 'Remove'))?

1 Ответ

3 голосов
/ 22 марта 2020

Используйте Series.duplicated с keep=False для всех дупликов и цепочку со сравнением для Remove, цепочку вместе для | для побитового OR и инвертирующую маску для ~:

m1 = df['ID'].duplicated(keep=False)
m2 = (df['Symbol'] == 'Remove')

df = df[~(m1 & m2)]

print (df)
      Name Symbol         ID
1  Zoo Inc    ZZZ  88579Y101
2    A Inc    AAA  90138A103
4   2U Inc   TWUO  90214J101
5     Keep     Remove  111111111
...