不同长度的列中变量之间的绝对差异

时间:2017-10-13 21:51:31

标签: python pandas numpy

修改::::: 所以我需要将它用于x和y坐标。所以DF1有5384167对,DF2有1928对。

我理解@Divakar的解决方案如何适用于一个变量。在我的具体情况下,我有地铁坐标,我想比较它们与犯罪坐标的接近程度。查看与最近的地铁站的犯罪类型和欧几里德距离是否相关。

我知道sqrt(DF1 [x] -DF2 [x])** 2 +(DF1 [y] -DF2 [y])** 2)需要在地铁位置的所有X,Y之间完成犯罪地点的每个X,Y。

犯罪协调员:

$(document).ready(function () { $("#suggest").autocomplete({ delay: 100, source: function (request, response) { // Suggest URL var catchUrl = "http://55.215.165.15:8086/AutoComplete?prefix=%QUERY"; catchUrl = catchUrl.replace('%QUERY', request.term); // JSONP Request $.ajax({ method: 'GET', dataType: 'jsonp', jsonpCallback: 'jsonCallback', url: catchUrl }) .success(function(data){ response(data[0]); }); } }); });

地铁坐标:

X_COORD_CD Y_COORD_CD 0 1007314.0 241257.0 1 1043991.0 193406.0 2 999463.0 231690.0 3 1060183.0 177862.0 4 987606.0 208148.0

X_COORD_CD Y_COORD_CD 0 1020671.0 248680.0 1 1019420.0 245867.0 2 1017558.0 245632.0

所以Dist_sub1 [0] =((X_Crime [0] - X_Subway [0])** 2 +(Y_Crime [0] - Y_Subway [0])** 2)** 0.5

Dist_sub2 [3] =((X_Crime [3] - X_Subway [1])** 2 +(Y_Crime [3] - Y_Subway [1])** 2)** 0.5

所以犯罪[0]到地铁的最小距离是10243.78646(Subway [2]);犯罪[1]是23318.81485(Subway [0]);犯罪[2]是18094.61475(Subway [2]);犯罪[3]是39511.10383(Subway [0]);犯罪[4]是29951.37426(地铁[2])

END OF EDIT

我在两个独立的数据框中有一个x和y坐标列表。一个有5384167个条目,另一个有1928个条目。

我正在试图弄清楚如何计算df1和df2中每个条目之间的绝对距离,然后找出最小值。例如:

df1:

X_Crime    Y_Crime   X_Subway  Y_Subway   Dist_sub1    Dist_sub2   Dist_sub3
1007314     241257    1020671   248680     13356.72213  12105.8096  10243.78646
1043991     193406    1019420   245867     23318.81485  24569.93244 26432.01209
999463      231690    1017558   245632     21207.59944  19956.64481 18094.61475
1060183     177862                         39511.10383  40762.16584 42624.20504
987606      208148                         33064.38708  31813.40719 29951.37426

df2:

x
1
2
3

我知道创建矩阵是可行的方法,但我确实不知道如何到达那里。矩阵看起来像这样:

x
4
5
6
7

然后我会得到每列的最小值:

3   2   1
4   3   2
5   4   3
6   5   4

1 个答案:

答案 0 :(得分:1)

可以提出两种方法。

方法#1

具有大量内存要求的NumPy broacasting的一种方法是 -

def abs_min_broadcasting(a, b): # a, b are input arrays
    return np.abs(a[:,None]-b).min(axis=0)

output = abs_min_broadcasting(df2.x.values, df1.x.values)

方法#2

另一种有效的记忆效应,与np.searchsorted -

一样快
def abs_min_searchsorted(a, b): # a, b are input arrays
    a_s = np.sort(a) # skip this if already sorted
    lidx = np.searchsorted(a_s,b).clip(max=len(a_s)-1)
    ridx = (lidx-1).clip(min=0)
    return np.minimum( np.abs(a_s[lidx] - b), np.abs(a_s[ridx] - b) )

output = abs_min_searchsorted(df2.x.values, df1.x.values)

示例运行 -

In [866]: df1
Out[866]: 
   x
0  1
1  2
2  3

In [867]: df2
Out[867]: 
   x
0  4
1  5
2  6
3  7

In [869]: abs_min_broadcasting(df2.x.values, df1.x.values)
Out[869]: array([3, 2, 1])

In [870]: abs_min_searchsorted(df2.x.values, df1.x.values)
Out[870]: array([3, 2, 1])

运行时测试 -

In [872]: df1 = pd.DataFrame({'x':np.random.randint(0,100,(10000))})

In [873]: df2 = pd.DataFrame({'x':np.random.randint(0,100,(1000))})

In [874]: %timeit abs_min_broadcasting(df2.x.values, df1.x.values)
10 loops, best of 3: 28.4 ms per loop

In [875]: %timeit abs_min_searchsorted(df2.x.values, df1.x.values)
1000 loops, best of 3: 663 µs per loop

In [876]: out1 = abs_min_searchsorted(df2.x.values, df1.x.values)
     ...: out2 = abs_min_broadcasting(df2.x.values, df1.x.values)
     ...: print np.allclose(out1, out2)
     ...: 
True