我有一个包含组ID、两个距离度量(经度/纬度类型的度量)和一个值的数据框。对于给定的距离集,我想找到附近其他组的数量,以及这些附近其他组的平均值。
我编写了以下代码,但效率太低,对于非常大的数据集,它根本无法在合理的时间内完成。计算附近零售商很快,但计算附近零售商的平均值非常慢。有没有更好的方法使其更加高效?
我编写了以下代码,但效率太低,对于非常大的数据集,它根本无法在合理的时间内完成。计算附近零售商很快,但计算附近零售商的平均值非常慢。有没有更好的方法使其更加高效?
distances = [1,2]
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)),
columns=['Group','Dist1','Dist2','Value'])
# get one row per group, with the two distances for each row
df_groups = df.groupby('Group')[['Dist1','Dist2']].mean()
# create KDTree for quick searching
tree = cKDTree(df_groups[['Dist1','Dist2']])
# find points within a given radius
for i in distances:
closeby = tree.query_ball_tree(tree, r=i)
# put into density column
df_groups['groups_within_' + str(i) + 'miles'] = [len(x) for x in closeby]
# get average values of nearby groups
for idx, val in enumerate(df_groups.index):
val_idx = df_groups.iloc[closeby[idx]].index.values
mean = df.loc[df['Group'].isin(val_idx), 'Value'].mean()
df_groups.loc[val, str(i) + '_mean_values'] = mean
# merge back to dataframe
df = pd.merge(df, df_groups[['groups_within_' + str(i) + 'miles',
str(i) + '_mean_values']],
left_on='Group',
right_index=True)