我有一个函数,该函数返回bool
的坐标位于df
提供的圆内。我的目标是使此功能更具动态性,并在圆坐标更改位置时在每个时间点应用圆。此刻,该函数在第一行获取圆坐标并测量其中的所有坐标。
我希望为每个时间点更新圆并在该特定时间点测量其中的坐标。该圆是根据mainX
,mainY
生成的。我想将其用于每个唯一的时间点,并在此圆内返回X, Y
的坐标。
下面提供了预期输出的完整说明。
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' : [1,2,3,4,5,2,3,4,5,6],
'Y' : [11,12,13,14,15,11,12,13,14,15],
'mainX' : [3,3,3,3,3,4,4,4,4,4],
'mainY' : [12,12,12,12,12,14,14,14,14,14]
})
def in_circle(center_x, center_y, x, y, radius = 1):
'''
Quantify points within a specified radius. Return df of labels that are True.
'''
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
return square_dist <= radius ** 2
points = in_circle(df['mainX'].iloc[0], df['mainY'].iloc[0], df['X'], df['Y'])
df = df[points]
输出:
Time Label X Y mainX mainY
1 09:00:00.1 B 2 12 3 12
2 09:00:00.1 C 3 13 3 12
6 09:00:00.2 B 3 12 4 14
预期输出:
Time Label X Y mainX mainY
1 09:00:00.1 B 2 12 3 12
2 09:00:00.1 C 3 13 3 12
3 09:00:00.2 C 4 13 4 13
4 09:00:00.2 D 5 14 4 13
此预期输出应该在时间点B,C
的{{1}}圆坐标内具有测量坐标3, 12
。对于09:00:00.1
的第二个时间点,它应具有09:00:00.2
的圆坐标内的测量坐标C, D
。
答案 0 :(得分:1)
要使对功能的更改保持最小,可以按以下方式修改功能:
方法:1:使用groupby
和unstack
square_dist <= radius ** 2
的布尔结果转换为整数,然后直接在df.Time, df.Group
上进行分组unstack
系列到数据框。reset_index
将Time
放回数据框代码:
def in_circle(df, center_x, center_y, x, y, radius = 2):
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
return ((square_dist <= radius ** 2).astype(int).groupby([df.Time, df.Group]).sum()
.rename_axis(['Time', None]).unstack()
.reset_index())
df_final = in_circle(df, df['mainX'], df['mainY'], df['X'], df['Y'])
Out[117]:
Time X Y
0 1 1 1
1 2 0 0
2 3 1 1
方法2 :使用pd.crosstab
def in_circle(df, center_x, center_y, x, y, radius = 2):
square_dist = (center_x - x) ** 2 + (center_y - y) ** 2
return pd.crosstab(df.Time, df.Group, (square_dist <= radius ** 2).astype(int),
aggfunc='sum').reset_index()
df_final = in_circle(df, df['mainX'], df['mainY'], df['X'], df['Y'])
Out[143]:
Group Time X Y
0 1 1 1
1 2 0 0
2 3 1 1