我有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