在不更改分组列位置的情况下,按另一列的一列排序

时间:2016-12-01 06:08:33

标签: python pandas numpy

考虑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

2 个答案:

答案 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]

enter image description here

目前,我无法弄清楚如何摆脱这种循环。

答案 1 :(得分:0)

对于你做出的例子:

w.r.t 排序为A和B,然后让A对索引进行排序。稍后,重置索引以生成引用DF

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

接下来,使用append将A设置为索引以及普通整数索引。对索引进行排序(属于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