【发布时间】:2021-01-29 03:10:36
【问题描述】:
我有一个 3 轴数据的 DataFrames,带有我用来分组的成员标签:
df = pd.DataFrame( [[0, 1, 2, 0],
[-1, 0, 1, 0],
[-2, 0, 3, 1],
[1, 1, 3, 1],
[1, 0, 2, 2],
[1, 0, 3, 2],
[6, 2, 1, 5],
[-4, 3, 0, 5],
[1, 0, -1, 6],
[0, 0, 3, 6]], columns = ['x', 'y', 'z', 'member'])
我的目标有点做作:我希望找到每个组的点与下一个n_skip 组之间的成对距离,从小到大排序。这个n_skip就是我所说的交错:
例如,对于n_skip=2,我希望找到:
-
member == 0的行 --> 与member == 1, 2 -
member == 1的行 --> 针对member == 2, 5 - 带有
member == 2的行 --> 针对member == 5, 6 - 带有
member == 5的行 --> 针对member == 6 -
member == 6没有计算。
在没有嵌套 for 循环的情况下,有没有一种高效的方法来做到这一点?这暗示了in this question answer. 直觉上我无法使用传统的apply 来并行化 Pandas DataFrames 上的函数。将函数应用于交错组的快速方法是什么?
EDIT1 我的解决方案(仅适用于一个轴):
## Heading ### Organize by group membership
groups = df.groupby('member')
# Define constants
max_member = 6
n_skip = 2
start_row = 0
matrix = np.zeros((df.shape[0], df.shape[0]))
# Iterate for each group
for i in range(max_member):
try:
pts_curr = groups.get_group(i)
except KeyError:
continue
# Save end row index
end_row = start_row + pts_curr.shape[0]
# Save start col index
start_col = end_row
# Grab the destination group nodes
for j in range(i+1, int(np.min([i+n_skip+1, max_member]))):
try:
pts_clr_next = groups.get_group(j)
except KeyError:
continue
# Save end col index
end_col = start_col + pts_clr_next.shape[0]
# Calculate cdist
z_sq = cdist(pts_curr[['z']], pts_next[['z']])
# Save results in matrix at right positions
matrix[start_row:end_row, start_col:end_col] = z_sq
# update col index
start_col = end_col
# update row index
start_row = end_row
【问题讨论】:
-
member组的行数是否始终相同? -
不,很遗憾他们没有。为方便起见,我制作了人为的示例,每个组具有相同数量的成员资格。
-
您的数据有多大?也许交叉合并就可以了。
-
它不是特别大。在实践中,我正在构建一个图表,上面的
matrix用于计算邻接矩阵。我的图表有 ~ 4000 个节点;但我有很多这样的单独图表(~1000 个图表)。但是,我正在尝试减少任何ms的时间。以前我对交叉合并的经验是它很慢。
标签: python pandas numpy dataframe scipy