2015-10-21 4 views
1

У меня есть два dataframes, (10,2) и (4,2), и я ищу более быстрый/более простой способ сравнить их по строкам подряд.pandas построить матрицу сравнения строк за строкой

x = pd.DataFrame([range(10),range(2,12)]) 
x = x.transpose() 
y = pd.DataFrame([[5,8],[2,3],[5,5]]) 

Я хотел бы построить матрицу сравнения (10,3), который показывает, какие строки в первом dataframe соответствовать следующим требованиям во втором dataframe. значение x 1 должно быть> = значение y [0], а значение x [0] должно быть < = значение y 1. На самом деле данные являются датами, но для простоты я просто использовал целые числа, чтобы упростить этот пример. Мы тестируем перекрытие в периоды времени, поэтому логика показывает, что в периоды соответствующих таблиц должно быть некоторое перекрытие.

arr = np.zeros((len(x),len(y)), dtype=bool) 
for xrow in x.index: 
    for yrow in y.index: 
     if x.loc[xrow,1] >= y.loc[yrow,0] and x.loc[xrow,0] <= y.loc[yrow,1]: 
      arr[xrow,yrow] = True 
arr 

enter image description here

грубой силы подход выше является слишком медленным. Любые предложения о том, как я мог бы векторизовать это или сделать какие-то сопоставленные сопоставления матриц?

ответ

2

Вы можете конвертировать x, y в NumPy массивы, а затем расширить размеры с np.newaxis/None, которые принесли бы в NumPy's broadcasting при выполнении тех же операций. Таким образом, все эти сравнения и выходной логический массив будут создаваться векторизованным образом. Реализация будет выглядеть следующим образом -

X = np.asarray(x) 
Y = np.asarray(y) 
arr = (X[:,None,1] >= Y[:,0]) & (X[:,None,0] <= Y[:,1]) 

Sample пробег -

In [207]: x = pd.DataFrame([range(10),range(2,12)]) 
    ...: x = x.transpose() 
    ...: y = pd.DataFrame([[5,8],[2,3],[5,5]]) 
    ...: 

In [208]: X = np.asarray(x) 
    ...: Y = np.asarray(y) 
    ...: arr = (X[:,None,1] >= Y[:,0]) & (X[:,None,0] <= Y[:,1]) 
    ...: 

In [209]: arr 
Out[209]: 
array([[False, True, False], 
     [False, True, False], 
     [False, True, False], 
     [ True, True, True], 
     [ True, False, True], 
     [ True, False, True], 
     [ True, False, False], 
     [ True, False, False], 
     [ True, False, False], 
     [False, False, False]], dtype=bool) 
+0

Perfect - я знал, что есть какой-то способ использовать вещание, мне придется сделать небольшое исследование, чтобы понять, как вы» они сочетаются, но это прекрасно работает. Благодаря! – flyingmeatball

+0

@flyingmeatball Вещание - лучшая вещь, которая произошла с NumPy, если вы спросите меня :) Итак, исследуйте! – Divakar

+0

Быстрое отключение в сторону, как вы отформатируете свой вывод из ноутбука ipython так хорошо, чтобы вписаться в ответ SO? Мне всегда нужно навсегда форматировать мою до публикации. – flyingmeatball