Python:使用两个csv得到最小平方根(或找到最小距离))



我有2个csv文件-

CSV A -

Col1   Col2         Col3        Col4         Col5        Col6
23      XY      -2852059.23, 5257582.12, -2205236.45      AA
25      AB      -2852159.23, 5257577.12, -2205245.43      BB
31      CF      -2852259.23, 5257569.12, -2205240.46      CC 
35      CV      -2852359.23, 5257565.12, -2205246.47      DD
76      FH      -2852459.23, 5257573.12, -2205241.47      EE
34      TY      -2852559.23, 5257564.12, -2205244.56      FF

CSV B -

Col1       Col2      Col3      Col4
75      -28059.23, 52582.12, -25236.45
23      -28159.23, 52577.12, -25245.43
34      -28259.23, 52569.12, -25240.46
56      -28359.23, 52565.12, -25246.47
67      -28459.23, 52573.12, -25241.47
34      -28559.23, 52564.12, -25244.56

我试图找到最小平方根或最小距离使用距离公式(√[(x₂- x₁)²+ (y₂- y₁)²+ (z₂- z₁)²])。例如:A.csv的第一行要与B.csv的所有行一一相减,计算平方根,然后从所有平方根中取最小平方根。对于a.v csv中的所有其他行,也需要执行相同的操作。

我使用下面的代码来实现相同的,它的工作如预期的。但是要花很多时间才能完成。

df1['min_sqrt'] = np.sqrt((df2['Col2'].apply(lambda x: (x-df1['Col3'])**2))+(df2['Col3'].apply(lambda x: (x-df1['Col4'])**2))+(df2['Col4'].apply(lambda x: (x-df1['Col5'])**2))).min()

寻找改进/更快的解决方案。提前谢谢你。

也尝试了合并函数。下面是代码-

out = (
df1.merge(df2, how="cross")
.assign(x= lambda df: (df['Col2'] - df['Col3']).pow(2),
y= lambda df: (df['Col3'] - df['Col4']).pow(2),
z= lambda df: (df['Col4'] - df['Col5']).pow(2),
distance= lambda df: np.sqrt(df.x + df.y + df.z))
.groupby(["Col1", "Col2", "Col3", "Col4", "Col5", "Col6"], sort=False, axis=0).agg(min_sqrt=("distance", "min"))

)

对于小数据集工作良好,但对于大数据文件给出内存错误。MemoryError:无法为形状为(31,100453255)和数据类型为float64的数组分配23.2 GiB

调用pandas.Series.apply需要这么多时间是正常的三次。

可以使用pandas.merge执行交叉连接然后用公式求出最小距离。

Try this:

out = (
df1.merge(df2, how="cross", suffixes=("_A", "_B"))
.assign(x= lambda df: (df['Col1_B'] - df['Col1_A']).pow(2),
y= lambda df: (df['Col2_B'] - df['Col2_A']).pow(2),
z= lambda df: (df['Col3_B'] - df['Col3_A']).pow(2),
distance= np.sqrt(x + y + z))
.groupby(["Col1_A", "Col2_A", "Col3_A"], as_index=False).agg(min_sqrt=("distance", "min"))

)
out.columns= out.columns.str.removesuffix("_A")

#输出:

pd.options.display.float_format = '{:.2f}'.format
print(out)
Col1       Col2        Col3   min_sqrt
0 -2852559.23 5257564.12 -2205244.56 6310261.56
1 -2852459.23 5257573.12 -2205241.47 6310223.17
2 -2852359.23 5257565.12 -2205246.47 6310173.55
3 -2852259.23 5257569.12 -2205240.46 6310130.02
4 -2852159.23 5257577.12 -2205245.43 6310093.59
5 -2852059.23 5257582.12 -2205236.45 6310049.86

这个方法快了6.7倍。

3.4 ms ± 430 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) #Rakesh ltani
507 µs ± 20.2 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each) #abokey

相关内容

  • 没有找到相关文章

最新更新