Вложенный цикл неэффективен, в поисках разумной альтернативы - PullRequest
0 голосов
/ 06 октября 2019

Вложено для цикла очень неэффективно по времени. У меня есть несколько идей, чтобы сделать это эффективным. Интересно, можно ли поделиться лучшими альтернативами?

Я пытаюсь создать в Python фрейм данных, извлекая значения из нескольких других фреймов данных. Для небольшого количества переменных / столбцов я могу выполнять простые присваивания. В приведенном ниже примере я хочу, чтобы сравнивалась ячейка в каждом из двух фреймов данных, и, если они равны, делаю назначение. Если они не равны, мне нужно перебрать второй кадр данных, пока каждая ячейка не будет оценена перед выполнением какого-либо назначения.

"" "повторяется в каждой строке первого кадра данных, а затем второго. Это делается для правильного сопоставления значений в сравниваемом столбце." ""

for i in range(len(df10)):
    for j in range(len(df6)):                 # this is not an efficient way to perform this action.
        if df10.iloc[i,0] == df6.iloc[j,1]:
            df10.iloc[i,23] = df6.iloc[j,6]
            df10.iloc[i,24] = df6.iloc[j,1]
df10.sample(n=5)

1 Ответ

0 голосов
/ 06 октября 2019

Вот как вы можете это сделать, см. Комментарий к описанию. Оставьте комментарий, если что-то не понятно

np.random.seed(10)
df10 = pd.DataFrame(np.random.choice(5, (5,5)))

df6 = pd.DataFrame(np.random.choice(5, (4,6)))

display(df10)
display(df6)

## compare each pair of rows from 0th column of df10 and 1st column of df6
## using numpy broadcast. Which will return matrix of boolean with true at
## element i,j where values are equal
cond = df10.iloc[:,0].values[:,np.newaxis] == df6.iloc[:,1].values

## get matching index in array when the matrix is flatten 
indx = np.arange(cond.size)[cond.ravel()]

## convert flattened index to row and colum index (i,j)
## where i crossponds to row index in df10 and j crossponds to 
## row index in df6
i,j = indx//len(df6), indx%len(df6)

## set value using fancy indexing
df10.iloc[i,3] = df6.iloc[j,4].values
df10
...