Фрейм данных Python Pandas удаляет повторяющиеся строки в зависимости от значения столбца

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных pandas, и я пытаюсь удалить дублирующиеся строки, если столбец файла равен «AAA». Если есть «AAA», но нет других строк с таким же идентификатором / именем, то я хочу оставить строку (ы) в покое.

Что у меня есть

 import pandas as pd

df = pd.DataFrame({'ID': [111, 222, 222, 333, 333, 444, 444, 444, 555, 555, 555, 555], 
                   'Name': ['David','Carl','Carl','Jane','Jane','Mike','Mike','Mike','Jake','Jake','Jake','Jake'],
                  'LE': ['AAA','AAA','BBB','BBB','CCC','AAA','BBB','CCC','AAA','BBB','CCC','DDD']})

print(df)

     ID   Name   LE
0   111  David  AAA
1   222   Carl  AAA
2   222   Carl  BBB
3   333   Jane  BBB
4   333   Jane  CCC
5   444   Mike  AAA
6   444   Mike  BBB
7   444   Mike  CCC
8   555   Jake  AAA
9   555   Jake  BBB
10  555   Jake  CCC
11  555   Jake  DDD
  

Чего я хочу

 
    ID   Name   LE
0  111  David  AAA
1  222   Carl  BBB
2  333   Jane  BBB
3  333   Jane  CCC
4  444   Mike  BBB
5  444   Mike  CCC
6  555   Jake  BBB
7  555   Jake  CCC
8  555   Jake  DDD

  

В этом случае строка с «David» остается одна, поскольку других экземпляров «David» нет.»

Строка с «Jane» оставлена в покое, поскольку в столбце «Файл» нет экземпляров «AAA».

В остальном все экземпляры с «AAA» в столбце LE удаляются, поскольку в двух других столбцах есть дублирующиеся данные.

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

tl; dr Удаляет повторяющиеся строки, только если столбец файла имеет значение ‘AAA’

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

1. Вместо изображений поместите редактируемый текст фрейма данных. Было бы легко взять ваши данные и предоставить ответы

2. Спасибо, внес изменения.

Ответ №1:

Вот однострочный —

Первый возвращает логический массив со строками, которые имеют дублированные значения файла, а второй возвращает логический массив со значениями ‘AAA’. Отрицание их amp; , которое используется для логического индекса df. Наконец, сбросьте и удалите индекс.

 df[~(df.duplicated(['LE']) amp; (df['LE']=='AAA'))].reset_index(drop=True)
  
     ID   Name   LE
0  111  David  AAA
1  222   Carl  BBB
2  333   Jane  BBB
3  333   Jane  CCC
4  444   Mike  BBB
5  444   Mike  CCC
6  555   Jake  BBB
7  555   Jake  CCC
8  555   Jake  DDD
  

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

1. На мой взгляд, это самый питонический способ

Ответ №2:

Я использовал counts_dictionary для подсчета количества вхождений имен, поскольку идентификатор был уникальным, поэтому не было смысла перебирать их. Затем я перебрал все строки в фрейме данных, и если их количество было больше 1 и было AAA в LE столбце, я удалил его

 counts_dictionary = {}
for index, row in df.iterrows():
    try:
        counts_dictionary[row['Name']] = counts_dictionary[row['Name']]   1
    except:
        counts_dictionary[row['Name']] = 1
        
for key in counts_dictionary:
    for index, row in df.iterrows():
        if row['LE'] == 'AAA' and counts_dictionary[row['Name']] > 1:
            df.drop(index, inplace=True)
                

df = df.reset_index(drop=True)