【问题标题】:Measure total count and avg distance between points - python测量点之间的总计数和平均距离 - python
【发布时间】:2021-03-03 02:45:20
【问题描述】:

我的目标是返回一定半径内点的总计数和平均距离。使用下面,半径的中心是2,中心由X2, Y2确定。

总会有一个点与X2, Y2 位于同一位置。我希望在分析中忽略这一点。

注意:我希望该函数能够及时处理多个时间点。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({        
    'Time' : [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3],                               
    'Item' : ['A','B','C','D','E','F','A','B','C','D','E','F','A','B','C','D'],       
    'x' : [4,5,8,3,6,2,6,4,3.5,2,4,6,6,2,4,4],
    'y' : [-2,0,-2,0,0,4,-1,-2,-2,4,-3,2,-2,0,-2.5,4],     
    'X2' : [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4],
    'Y2' : [-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2],                          
    })

sq_dist = (df['X2'] - df['x']) ** 2 + (df['Y2'] -  df['y']) ** 2    

# count of points within radius
count = ((sq_dist <= 2 ** 2).astype(int)
                             .groupby([df['Time']])
                             .sum()
                             .reset_index()
                             .fillna(0) 
                             )

# avg_distance between points within radius
df['dist'] = np.sqrt((df['X2'] - df['x']) ** 2 + (df['Y2'] -  df['y']) ** 2)
inside = df[sq_dist <= 2 ** 2].copy()

avg_dist = (inside.groupby(['Time'])['dist']
                              .mean()
                              .reset_index()
                              .fillna(0) 
                             )

如果我合并 countavg_dist 输出应该是:

   Time  count dist
0     1  0     0.0
1     2  2     0.75
2     3  1     0.5

【问题讨论】:

  • 对不起,现在修改了。
  • 谢谢,我在 Quang Hoang 的回答中添加了评论。

标签: python pandas


【解决方案1】:

你可以试试:

# distance to reference point 
dist = np.square(df[['x_ref','y_ref']] - df[['x','y']].values).sum(1) ** 0.5


(dist[dist.le(2)&dist.gt(0)]                # filter the valid points
   .groupby(df['Time'])                     # groupby Time
   .agg(['mean', 'count'])                  # count and mean
   .reindex(df.Time.unique(), fill_value=0)
)

输出:

      mean  count
Time             
1      0.0      0
2      1.0      1

【讨论】:

  • 我会调整问题。我需要一些可以处理多个时间点的。
  • 根据问题中给出的更新输出,我认为这个答案应该这样编辑:dist[dist.lt(2)&amp;dist.gt(0)].groupby(df['Time']).agg(['count', 'mean']).reindex(df.Time.unique(), fill_value=0).reset_index()
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2019-03-20
  • 2014-03-31
  • 2016-05-13
  • 2017-06-25
相关资源
最近更新 更多