按一列在另一列的组中排序,而不更改分组列的位置

2024-09-30 04:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一下df

df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))
df

enter image description here

我想用B定义的组对A进行排序。但我不希望A的位置改变。你知道吗

如果我尝试:

df.groupby('A', sort=False) \
    .apply(pd.DataFrame.sort_values, by='B') \
    .reset_index(drop=True)

enter image description here

您会注意到A被分组在一起。我想要这个:

enter image description here


Tags: falsedataframedf定义排序sortdictlist
2条回答

这是我想到的

df = pd.DataFrame(dict(A=list('babbaa'), B=list('zxyxzy')))

A, B = df.A.values, df.B.values

使用^{}逆(所有相对位置的索引值)。你知道吗

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]

enter image description here


目前,我不知道如何摆脱这个循环。你知道吗

举个人为的例子:

对A和B进行排序,让A取索引。稍后,重置索引以生成引用DF。你知道吗

A = df.sort_values(['A', 'B']).set_index('A').reset_index()

接下来,使用append将A与普通整数索引一起设置为索引。对索引进行排序(属于索引)。现在再次重置索引。你知道吗

B = df.set_index('A', append=True).sort_index(level=1).reset_index(level=1)

让A采用B的指数。对获取的索引轴进行排序。你知道吗

A.index = B.index
A.sort_index()

enter image description here

相关问题 更多 >

    热门问题