значительная разница в производительности pandas.merge? - PullRequest
0 голосов
/ 04 июня 2019

Я хочу сделать левое соединение с условием (если left.values> = right.lo & left.values ​​

Итак, я написал следующий код для:

  1. Удалить дубликаты ключей в левой базе данных
  2. Выполнить указанное выше условное объединение с правой базой данных
  3. Затем объединить полученную базу данных с исходной левой базой данных

Итак, мои вспомогательные функции:

import pandas as pd
import numpy as np

data = pd.read_pickle("C:/Quang/base_datalake_net.pkl")

t_BEH_VitMaxi = pd.read_csv("table/VEH_VitMaxi.csv", delimiter=';', decimal=',')
t_VEH_Age = pd.read_csv("table/VEH_Age.csv", delimiter=';', decimal=',')


def left_cond_merge_simple_help(left, right, left_on, right_on_lo, right_on_hi):
    left.reset_index(drop=True, inplace=True)
    right.reset_index(drop=True, inplace=True)
    a = left[left_on].values
    bh = right[right_on_hi].values
    bl = right[right_on_lo].values
    i, j = np.where((a[:, None] >= bl) & (a[:, None] < bh))
    result = pd.concat([left.loc[i].reset_index(drop=True),
                        right.loc[j].reset_index(drop=True)],
                       axis=1).append(
        left[~np.in1d(np.arange(len(left)), np.unique(i))], ignore_index=True)
    return result


def left_cond_merge_simple(left, right, left_on, right_on_lo, right_on_hi):
    temp = pd.DataFrame({left_on: left[left_on].unique()})
    temp = left_cond_merge_simple_help(left=temp, right=right, left_on=left_on,
                                       right_on_lo=right_on_lo, right_on_hi=right_on_hi)
    return left.merge(temp, on=left_on, how='left')

Странное поведение таково:

Если я запускаю только эту строку кода, это занимает 4 секунды,что является ненормально длинным, из-за шага 3, в то время как мой левый БД имеет размеры только 36000x300, мой правый БД имеет размеры 20x5, ключи справа уникальны.

% time data = left_cond_merge_simple(left=data, right=t_VEH_Age, left_on='VEH_Age', 
                                     right_on_lo='lo', right_on_hi='hi')

Но если я бегуэта строка кода после этой (которая также занимает 4 секунды), это займет всего 0,1 секунды:

% time data = left_cond_merge_simple(left=data, right=t_BEH_VitMaxi, left_on='VEH_VitMaxi',
                                     right_on_lo='lo', right_on_hi='hi')

В чем может быть причина?

Моя правая БД выглядит так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...