【发布时间】:2018-07-25 05:05:16
【问题描述】:
目标:
我想使用 python 以一种有效的方式将两个数据帧 df1 和 df2 与容差合并。 df1 的形状为 (l, 2),df2 的形状为 (p, 13),其中 l
我想将 df1 的 Col0 与 df2 的 Col2 以容差“容差”合并。
例子:
df1:
Index, Col0, Col1
0, 1008.5155, n01
df2:
Index, Col0, Col1, Col2, Col3, Col4, Col5, Col6, ...
0, 0, 0, 510.0103, k03, 0, k05, k06, ...
1, 0, 0, 1007.6176, k13, 0, k15, k16, ...
2, 0, 0, 1008.6248, k123, 0, k25, k26, ...
df3:
Index, Col0, Col1, Col2, Col3, Col4, Col5, Col6, ...
0, 1008.5155, 0.8979, 1007.6176, k03, n01, k05, k06, ...
1, 1008.5155, 0.1093, 1008.6248, k13, n01, k15, k16, ...
为了形象化,df3 的 col1 给出了 df1 和 df2 各自值的差异。因此,它必须小于公差。
我当前的解决方案需要很多时间并且需要大量内存。
# Create empty list to collect matches
df3_list = []
df3_array = np.asarray(df3_list)
# loops to find matches. Fills array with matches
df3_row = np.asarray([0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0])
for n in range(len(df1)):
for k in range(len(df2)):
if abs(df1.iloc[n,0]-df2.iloc[k,2]) < tolerance:
df3_row[0] = df1.iloc[n,0]
df3_row[1] = abs(df1.iloc[n,0]-df2.iloc[k,2])
df3_row[2] = df2.iloc[k,2]
df3_row[3] = df2.iloc[k,3]
df3_row[4] = df1.iloc[n,1]
df3_row[5] = df2.iloc[k,5]
.
.
.
df3_array = np.append(df3_array, df3_row)
# convert list into dataframe
df3 = pd.DataFrame(df3_array.T.reshape(-1,13), columns = header)
我也尝试过同时获得两个索引
[[n, k] for n, k in zip(range(len(df1)), range(len(df2))) if abs(df1.iloc[n,0]-df2.iloc[k,2]) < tolerance]
但是,它只给了我一个空数组,所以我做错了。
对于各自的数组,我也尝试过使用
np.nonzero(np.isclose(df2_array[:, 2], df1_array[:,:,None], atol=tolerance))[-1]
但是,np.isclose + np.nonzero 只为我提供了 df2 的索引,而且比我的循环密集型方法要多得多。如果没有 df1 的相应索引,我有点迷茫。 我认为这最后一种方法是最有前途的,但我似乎无法合并数据集,因为这些值不是完全匹配的,而且最接近的匹配并不总是正确的解决方案。任何想法如何克服这个问题?
【问题讨论】:
标签: python pandas numpy dataframe merge