考虑df
df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
df
我想使用B
定义的组对A
进行排序。但我不希望A
的职位发生变化。
如果我尝试:
df.groupby('A', sort=False) \
.apply(pd.DataFrame.sort_values, by='B') \
.reset_index(drop=True)
您会注意到A
已组合在一起。我想要这个:
答案 0 :(得分:1)
这就是我提出的问题
df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
A, B = df.A.values, df.B.values
使用np.unique
反向(所有相对位置的索引值)。
u, iv = np.unique(A, return_inverse=True)
使用逆和广播为每个组创建一行,其中每一行都是该组的布尔掩码。
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]
目前,我无法弄清楚如何摆脱这种循环。
答案 1 :(得分:0)