我有一个工作脚本,它返回一个df,其中包含给定半径内的点数。下面的示例
Label
{Label
中所有唯一值的最有效方法是什么?而不是一次只传递一个值李>代码:
import pandas as pd
import numpy as np
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,2,4,2],
})
def countPoints(coordinates, ID, radius):
"""Create df that returns coordinates within unique id radius."""
points = coordinates[['X', 'Y']].values
array = points[:,None,:] - points[0:,]
distance = np.linalg.norm(array, axis = 2)
df = coordinates[distance[coordinates['Label'].eq(ID).values.argmax()] <= radius]
df['Point'] = ID
return df
目前,我将函数分别应用于Label
中的所有值,然后将df连接在一起。如果Label
中有许多唯一的值,那么这将变得效率低下
是否有一种方法可以迭代地应用它
# Label A
df_A = df.groupby('Time').apply(countPoints, ID = 'A', radius = 1).reset_index(drop = True)
# Label B
df_B = df.groupby('Time').apply(countPoints, ID = 'B', radius = 1).reset_index(drop = True)
# Label C
df_C = df.groupby('Time').apply(countPoints, ID = 'C', radius = 1).reset_index(drop = True)
# Combine df's
df1 = pd.concat([df_A, df_B, df_C]).sort_values(by = 'Time').reset_index(drop = True)
预期产出:
Time Label X Y Point
0 09:00:00.1 A 8 3 A
1 09:00:00.1 D 8 4 A
2 09:00:00.1 E 7 3 A
3 09:00:00.1 B 4 3 B
4 09:00:00.1 C 3 3 B
5 09:00:00.1 B 4 3 C
6 09:00:00.1 C 3 3 C
7 09:00:00.2 A 7 2 A
8 09:00:00.2 E 6 2 A
9 09:00:00.2 B 3 1 B
10 09:00:00.2 C 3 2 B
11 09:00:00.2 B 3 1 C
12 09:00:00.2 C 3 2 C
如果您将radius值附加到数据帧中(这应该很便宜),那么您应该能够完全消除函数应用程序
只需将
pd.concat
移动到函数countPoints
的内部,如下所示上面是所有
ID
的输出,您的预期输出是A
、B
、C
。所以,只需切片df_out
就可以只拾取那些3ID
相关问题 更多 >
编程相关推荐