考虑df
df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
df
我想用 A
定义的组对 B
进行排序。但我不想改变 A
的位置。
如果我尝试:
df.groupby('A', sort=False) \
.apply(pd.DataFrame.sort_values, by='B') \
.reset_index(drop=True)
您会注意到 A
组合在一起。我想要这个:
最佳答案
这是我想出来的
df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
A, B = df.A.values, df.B.values
使用np.unique
inverse(所有相对位置的索引值)。
u, iv = np.unique(A, return_inverse=True)
使用反向和广播为每个组创建一行,其中每一行都是该组的 bool 掩码。
is_ = np.arange(len(u))[:, None] == iv
遍历行并使用更新值重新分配位置跟踪数组 i
。
i = np.arange(len(df))
for r in is_:
i[r] = i[r][df.B.values[r].argsort()]
使用新的位置值
df.iloc[i]
目前,我不知道如何摆脱这个循环。
关于python - 在不改变分组列位置的情况下按另一组中的一列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903704/