Есть python код
def post_transform_data(df, read_fun=read_all_variance, model_version=3, data=None,
                       nb_channel=read_nb_channel_detchanel_for_bids):

    df = df.sort_values(by=['Регион хранения', 'НБ', 'Канал реализации',
       'Детализированный канал реализации', 'Группа хранения', 'Тип НП',
       'НП поставки', 'Группа НП', 'Номер группы', 'Штраф за снижение, руб/тн',
       'Штраф за превышение, руб/тн', 'Группа', 'Дата начала периода',
       'Кол-во периодов', 'Группировка периодов', 'np_group_index',
       'store_group_index', 'Группировка периода', 'Дата', 'merge_column',
       't_group_index'])

    df['cnstr_index'] = range(1, len(df) + 1)

    oversale_group_index = 1
    res_eq = pd.DataFrame()
    all_variance = read_fun(data=data).rename(columns={'НП': 'НП поставки', 'Тип транспортировки': 'Тип транспорта'})
    nb_channel_det_channel = nb_channel(data=data).rename(columns={'НП': 'НП поставки', 'Тип транспортировки': 'Тип транспорта'})

    column_other = ['Номер группы', 'cnstr_index', 'Группа', 'Кол-во периодов', 'Группировка периодов',
                    'merge_column', 't_group_index', 'np_group_index',
                    'prod_group_index', 'cnstr_index', 'Штраф за превышение, руб/тн', 'Штраф за снижение, руб/тн',
                    'Группа производства', 'Признак группировки', 'Наименование группы', 'Условия покупки', 'НП класс',
                    'Дата начала периода', 'store_group_index', 'Группа хранения', 'Группировка периода']

    df = df.sort_values(by='Номер группы')

    for by_number_group in df.groupby('Номер группы', as_index=False, sort=True):
        constraints_i = by_number_group[1]
        variance_all = pd.DataFrame()
        column_use_list_all = []

        constraints_i = constraints_i.sort_values(by='cnstr_index')

        for by_index in constraints_i.groupby('cnstr_index', as_index=False, sort=True):
            constraints_i_ind = by_index[1].replace('', float('nan')).replace('all', float('nan')).dropna(axis=1)
            column_use_list = list(
                set(by_index[1].replace('', float('nan')).dropna(axis=1).columns).difference(set(column_other))
            )
            column_use_list_all.extend(column_use_list)

            variance = constraints_i_ind.merge(
                all_variance,
                on=list(set(constraints_i_ind.columns).difference(set(column_other)))
            )
            variance_all = pd.concat([variance_all,variance], ignore_index=True)

        # Фильтруем цепочки по каналам и дет каналам (которые реально могут существовать)
        variance_all = variance_all.merge(
            nb_channel_det_channel[['Канал реализации', 'Детализированный канал реализации', 'НБ']],
            how='inner',
            on=['Канал реализации', 'Детализированный канал реализации', 'НБ']
        )

        # variance_all = pd.concat([variance_all,variance_dropped[variance_all.columns]])
        variance_all = variance_all.drop_duplicates()

        need_columns = list(set(MAIN_COLUMNS).difference(set(column_use_list_all))) + ['Дата']
        variance_all = variance_all.sort_values(by=need_columns)

        for group_i in variance_all.groupby(need_columns, sort=True):
            group_i_df = group_i[1]
            group_i_df = group_i_df.drop_duplicates()
            if len(group_i_df) > 1:
                variance_all.loc[group_i_df.index, 'oversale_group_index'] = oversale_group_index
                oversale_group_index += 1

        res_eq = pd.concat([res_eq,variance_all],ignore_index=False)

    if res_eq.get('oversale_group_index') is None:
        res_eq['oversale_group_index'] = None
    res_eq = res_eq[res_eq['oversale_group_index'].notna()]
    res_eq['oversale_group_index'] = res_eq['oversale_group_index'].astype(int)

    param_with_value1 = 'Штраф за снижение, руб/тн'
    param_with_value2 = 'Штраф за превышение, руб/тн'
    column_name = 'with_penalty'
    if param_with_value1 not in res_eq.columns:
        res_eq[param_with_value1] = float('nan')
    if param_with_value2 not in res_eq.columns:
        res_eq[param_with_value2] = float('nan')
    set_with_value = res_eq[(res_eq[param_with_value1].notna()) | (res_eq[param_with_value2].notna())]
    res_eq.loc[set_with_value.index, column_name] = res_eq.loc[set_with_value.index, 'oversale_group_index']
    res_eq.loc[res_eq[~res_eq[column_name].notna()].index, column_name] = 0
    res_eq[column_name] = res_eq[column_name].astype(int)
    res_eq = res_eq.drop_duplicates()

    if res_eq.empty:
        columns_need = ['Регион хранения', 'НП поставки', 'Номер группы', 'Группа',
                        'Дата начала периода', 'Кол-во периодов', 'Группировка периодов',
                        'Дата', 'merge_column', 't_group_index', 'np_group_index',
                        'store_group_index', 'cnstr_index', 'НБ', 'Канал реализации',
                        'Детализированный канал реализации', 'Тип НП']
        for col_i in columns_need:
            res_eq[col_i] = None

    count_constr = res_eq.groupby('oversale_group_index').count()
    res_eq.to_csv('res_eq_2.csv')
    # 'Дата' или другое поле не важно, так как считается там количество элементов
    return res_eq[res_eq['oversale_group_index'].isin(count_constr[count_constr['Дата'] > 1].index)]

Почему на одних и тех же данных отличается таблица res_eq при разных запусках?
Как это исправить?