计算每个时间点半径内的坐标

时间:2019-11-26 22:49:04

标签: python pandas

我有一个函数,该函数返回bool的坐标位于df提供的圆内。我的目标是使此功能更具动态性,并在圆坐标更改位置时在每个时间点应用圆。此刻,该函数在第一行获取圆坐标并测量其中的所有坐标。

我希望为每个时间点更新圆并在该特定时间点测量其中的坐标。该圆是根据mainXmainY生成的。我想将其用于每个唯一的时间点,并在此圆内返回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

1 个答案:

答案 0 :(得分:1)

要使对功能的更改保持最小,可以按以下方式修改功能:

方法:1:使用groupbyunstack

  • square_dist <= radius ** 2的布尔结果转换为整数,然后直接在df.Time, df.Group上进行分组
  • 对每组groupby求和并将轴名称重命名为适当的名称 和unstack系列到数据框。
  • reset_indexTime放回数据框

代码:

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