python pandas не работает условие - not in

Я написал код, который считывает из xlsx файла данные и с помощью библиотеки pandas обрабатывает их как мне нужно. На выходе я хочу получить вывод строки (это команда), и всё работает. Но проблема в том, что в xlsx файле есть повторяющиеся строки и, соответственно, на выходе тоже есть повторяющиеся строки. Я хочу исключить дубликаты, и по этому создал переменную df2GEXTLTE и скидываю туда данные из другой переменной - ComprasionValue, которую я создал из 4 столбцов (там значения, которые служат идентификаторами нужных мне данных). Указал условия: если в df2GEXTLTE уже есть такие данные (not in), то не выводить на печать. Код работает, но дубликаты всё равно не удаляются, почему-то эти строки не считаются идентичными. Ниже привёл код и скрин данных из xlsx файла ( для понимания с чем файл работает).

Подскажите, пожалуйста, почему не срабатывает условие not in? Возможно есть другой вариант решения моей задачи?

import pandas as pd
data = pd.read_excel('C:\Myronchuk\Pyton\File for open\HO.xlsx', usecols='A:R')
for index,row in data.iterrows():
    source_azz = row['Azimuth'][:-1]                    # убрать знак градусов с азимутов(source) (последний символ)
    if len(source_azz) == 2 or len(source_azz) == 1:    # если в азимуте 1 или 2 символа - добавляю нули (source)
        source_azz = source_azz.zfill(3)
    correct_source_name = row['Site Name'][:11]         # Оставить в нейме корректное название БС (1 символов) (source)
    full_source_name = correct_source_name + '_' + source_azz + '_' + row['Site Name'][-1]   # склеиваю все переменные выше для корректного имени (source)
    target_azz = row['Target Azimuth'][:-1]             # убрать знак градусов с азимутов(target) (последний символ)
    if len (target_azz) == 2 or len(target_azz) == 1:   # если в азимуте 1 или 2 символа - добавляю нули (target)
        target_azz = target_azz.zfill(3)
    correct_target_name = row['Target Site Name'][:11]  # Оставить в нейме корректное название БС (1 символов) (target)
    LTEBCCH = 'a'                                       # Создаю переменную LTEBCCH ( по другому не хотело добавлять в full_target_name
    if row['Target BCCH'] == 3676:                      # распределяю стандарты LTE
        LTEBCCH = 'L09'
    if row['Target BCCH'] == 1700:
        LTEBCCH = 'L18'
    if row['Target BCCH'] == 2900:
        LTEBCCH = 'L26'
    full_target_name = correct_target_name + '_' + target_azz + '_' + LTEBCCH                # склеиваю все переменные выше для корректного имени (target)
    Target_Cell_IDstr = str(row['Target Cell_ID'])
    Correct_LTECI_Target = int(Target_Cell_IDstr[:-3]) * 256 + int(Target_Cell_IDstr[-3:])
    ComprasionValue = str(row['Cell_ID']) + str(row['LAC']) + str(row['Target Cell_ID']) + str(row['Target LAC'])
    df2GEXTLTE = set()
    if ((row['BCCH']) < 950 and ((row['Target BCCH']) == 3676 or (row['Target BCCH']) == 1700 or (row['Target BCCH']) == 2900)) and (ComprasionValue not in df2GEXTLTE):
        print('ADD GEXTLTECELL:EXTLTECELLNAME=' + '"' + full_target_name + '"' + ',MCC=' + '"' + '255' + '"' + ',MNC=' + '"' + '01' + ',ENODEBTYPE=MACRO,CI=' + str(Correct_LTECI_Target) + ',TAC=' + str(row['Target LAC']) + ',FREQ=' + str(row['Target BCCH']) + ',PCID=' + str(row['Target BSIC']) + ',EUTRANTYPE=FDD,OPNAME="MTS Ukraine";')
        df2GEXTLTE.add(ComprasionValue)

На втором скрине то, что получается если выводить переменную df2GEXTLTE ( здесь есть 2 идентичных числа - два первых и два последних) исходя из кода 2 последних не должны были добавиться в эту переменную и соответственно не выводиться на принт

HO.xlsx

print df2GEXTLTE


Ответы (1 шт):

Автор решения: CrazyElf

А, всё, дошло до меня:

for index,row in data.iterrows():
    ...
    df2GEXTLTE = set() # <-- всегда будет пустое!!!
    if ... and (ComprasionValue not in df2GEXTLTE):

Вы инициализируете множество df2GEXTLTE на каждой итерации цикла, оно у вас всегда пустое перед проверкой, поэтому not in и не срабатывает - в пустом множестве ничего нет. Нужно вынести инициализацию множества df2GEXTLTE за начало цикла:

df2GEXTLTE = set()
for index,row in data.iterrows():
    ...
    if ... and (ComprasionValue not in df2GEXTLTE):
→ Ссылка