The problem is very similar to the well known closest pair of points problem. You can find some solutions here. In that case, the optimal solution can be found in O(nlogn) time. However, I think this is not the case.
For example, all your points might be inside the same circle of radius < 0.5, i.e. all the pairs of points are "close" (distance < 1km). In that case you need to at least generate all of them, an that has the same complexity of finding all the combinations of different points.
You could try with a brute force approach that check all the combinations (in this way you either check the pair (A,B) or (B,A)):
from itertools import combinations
def dist(a, b):
return sqrt((a[1] - b[1])^2 + (a[2] - b[2])^2)
def closer_than_epsilon(points_list, epsilon):
return [(p1, p2)
for p1, p2 in combinations(points_list, r=2)
if dist(p1, p2) < epsilon]
# df is your pd.DataFrame with three columns: name, x_coor, y_coor
result = closer_than_epsilon(df.values.tolist(), 1)