Есть несколько вопросов по этому поводу, но я застрял. У меня df
есть координаты различных точек разброса. Я хочу создать радиус вокруг одной из этих точек и вернуть точки, которые находятся в этом радиусе для каждого момента времени. Используя приведенное df
ниже, я хочу вернуть df, содержащий все точки в радиусе вокруг A
для каждого момента времени.
import pandas as pd
df = pd.DataFrame({
'Time' : ['09:00:00.1','09:00:00.1','09:00:00.1','09:00:00.1','09:00:00.1','09:00:00.2','09:00:00.2','09:00:00.2','09:00:00.2','09:00:00.2'],
'Label' : ['A','B','C','D','E','A','B','C','D','E'],
'X' : [8,4,3,8,7,7,3,3,4,6],
'Y' : [3,3,3,4,3,2,1,5,4,2],
})
x_data = (df.groupby(['Time'])['X'].apply(list))
y_data = (df.groupby(['Time'])['Y'].apply(list))
AX_data = (df.loc[df['Label'] == 'A']['X'])
AY_data = (df.loc[df['Label'] == 'A']['Y'])
def countPoints(df, center_x, center_y, x, y, radius):
'''
Count number of points within radius for label A
'''
# Determine square distance
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
# Return df of rows within radius
df = df[square_dist <= radius ** 2].copy()
return df
df = countPoints(df, AX_data, AY_data, x_data, y_data, radius = 1)
Предполагаемый результат:
Time Label X Y
0 09:00:00.1 A 8 3
1 09:00:00.1 D 8 4
2 09:00:00.1 E 7 3
3 09:00:00.2 A 7 2
4 09:00:00.2 E 6 2
Здесь я использую np.linalg.norm
def calc_dist(gp, a_label, r=1):
dist_df = gp[['X', 'Y']] - gp.loc[gp.Label.eq(a_label), ['X', 'Y']].values
dist_arr = np.linalg.norm(dist_df, axis=1)
return gp[dist_arr <= r]
df_A = df.groupby('Time').apply(calc_dist, a_label='A', r=1).reset_index(drop=True)
Out[2159]:
Time Label X Y
0 09:00:00.1 A 8 3
1 09:00:00.1 D 8 4
2 09:00:00.1 E 7 3
3 09:00:00.2 A 7 2
4 09:00:00.2 E 6 2
Способ 2 :
df1 = df.where(df.Label.eq('A')).groupby(df.Time).apply(lambda x: x.ffill().bfill())
m = np.linalg.norm(df[['X', 'Y']] - df1[['X', 'Y']], axis=1) <= 1
df_A = df[m]
Out[2262]:
Time Label X Y
0 09:00:00.1 A 8 3
3 09:00:00.1 D 8 4
4 09:00:00.1 E 7 3
5 09:00:00.2 A 7 2
9 09:00:00.2 E 6 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句