如何通过复杂的条件合并两个数据帧



Python 3.9.5

第一个大DataFrame包含点,第二个大DataFrame包含正方形区域。正方形区域由四条平行于坐标轴的直线定义,并完全由一组约束定义:y_min、y_max、x_min、x_max。例如:

points = pd.DataFrame({'y':[0.5, 0.5, 1.5, 1.5], 'x':[0.5, 1.5, 1.5, 0.5]})
points
y          x
0       0.5        0.5
1       0.5        1.5
2       1.5        1.5
3       1.5        0.5
square_areas = pd.DataFrame({'y_min':[0,1], 'y_max':[1,2], 'x_min':[0,1], 'x_max':[1,2]})
square_areas
y_min    y_max     x_min     x_max
0        0        1         0         1
1        1        2         1         2

如果没有循环中区域的顺序枚举,如何获得不属于正方形区域的所有点?

所需输出:

y          x
0      0.5        1.5
1      1.5        0.5

我不知道如何使用"merge"来实现这一点,但您可以迭代square_areas数据帧并评估点数据帧的条件。

我假设您将有两个以上的测试用例,所以这种迭代方法应该有效。每次迭代只查看先前square_areas行尚未评估的点。

points = pd.DataFrame({'y':[0.5, 0.5, 1.5, 1.5], 'x':[0.5, 1.5, 1.5, 0.5]})
print(points)
# assume everything is outside until it evaluates inside
points['outside'] = 'Y'
square_areas = pd.DataFrame({'y_min':[0,1], 'y_max':[1,2], 'x_min':[0,1], 'x_max':[1,2]})
print(square_areas)
for i in range(square_areas.shape[0]):
ymin = square_areas.iloc[i]['y_min']
ymax = square_areas.iloc[i]['y_max']
xmin = square_areas.iloc[i]['x_min']
xmax = square_areas.iloc[i]['x_max']
points.loc[points['outside'] == 'Y', 'outside'] = np.where(points[points['outside'] == 'Y']['x'].between(xmin, xmax) & points[points['outside'] == 'Y']['y'].between(ymin, ymax), 'N', points[points['outside'] == 'Y']['outside'])

points.loc[points['outside'] == 'Y']

输出

y       x outside
1 0.50000 1.50000       Y
3 1.50000 0.50000       Y

最新更新