Разбиение массива данных на 2 разных массива и выгрузка в CSV

Есть запрос с информацией о клиентах к БД, который сохраняется в DF. Основная задача разделить список клиентов на 2 лагеря (2 массива):

  1. Лояльные клиенты, которые находятся в компании все время (т.е. если он например с нами с 2015 года заключает договор и никуда не уходил, или если есть разрыв в 1 год (с 2015 года с нами в 2019 нету, в 2020 вернулся), или если он с нами на протяжении 2 лет подряд, т.е. 2020, 2021, с условием что он не был с нами до этого.
  2. Остальные 2 лагерь. Ниже приведу пример выборки, и как раз ответ на вопрос почему несколько строк по 1 идентификатору и почему я использовал row_number в запросе выгрузки.

Вот такой нужен молоток, с учетом того, что пока не могу понять как правильно разделить клиентов (в части математической функции), встал вопрос вытащить просто 100 записей на которых буду тренироваться, заодно и пойму как разбить их на 2 массива и правильно выгружать ( вопрос выгрузки открытый, выгружаются но криво, много пробелов и повторяющиеся названия столбцов для каждого ФЛ)

Входные данные: Входные данные:

df = pd.DataFrame(result.fetchall(), columns=['Идентификатор ФЛ', 'ФИО',
                                              'Дата заключения договора', 'Дата начала договора',
                                              'Дата окончания договора', 'Тип договора',
                                              'Код продукта', 'Год заключения договора',
                                              'Сортировка'])


object_id = [x for x in df['Идентификатор ФЛ']]
uniq_object_id = [y for y in set(object_id)]

my_list = []
count = 0
for elem in uniq_object_id:
    count += 1
    my_list.append(df[df['Идентификатор ФЛ'] == elem])
    if count == 100:
        df_1 = pd.DataFrame(my_list, columns=df.columns)
        df_1.to_csv('result.csv', sep=';', index=False, encoding='utf-8')
        print(df_1)
        break
    else:
        continue

Выходные данные: Выходные данные

При э Старый вопрос. /* По идентификатору ФЛ, мне нужно вытащить данные именно по этому ФЛ и вставить их в другой DF, после чего записать этот DF в csv файл. Предположим, что мне нужно вставить 100 строк. Я создал DF из запроса, дальше вытащил все идентификаторы ФЛ, сделал их уникальными (для каждого ФЛ может быть несколько строк, так как столбец "Сортировка", содержит значения row_number. Создал пустой список, куда будут сохраняться мои строки, объявил счетчик который вытащит мне только 100 записей. В цикле я пытаюсь вытащить строки по условию my_list.append(df[df['Идентификатор ФЛ'] == elem]). И такое ощущение что заполняя мой пустой список, я делаю что-то не так, ибо в csv падает всякая ерунда. Может кто подскажет что я делаю не так, или может мой алгоритм не совсем корректен. Спасибо. *\


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

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

Что касается алгоритма, как мне кажется, для того чтобы разделить людей на 2 группы вы могли бы посчитать разницу между датой начала договора и датой конца договора и округлить её до года. далее просуммировать года и получить сколько лет каждый из них работает с компанией. На следующем шаге вычесть из текущего на данный момент года год начала работы с компанией. Найти разницу сколько человек работает с компанией и сколько всего прошло лет с начала работы. Если разница не более 1 года, то проходит в группу лояльных клиентов. Что касается реализации, то при работе с pd.dataframe не рекомендуется использовать циклы в принципе. Посмотрите как работать с функциями pd.to_datetime - для работы с временными столбцами; pd.groupby - для группировки по уникальным значениям столбца; pd.loc - для среза таблицы по условию в ячейках

→ Ссылка