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 последних не должны были добавиться в эту переменную и соответственно не выводиться на принт
Ответы (1 шт):
А, всё, дошло до меня:
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):

