2016-12-01 48 views
2

的位置考虑df排序的另一组中的一列不改变分组列

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

enter image description here

我想排序BA定义的组。但我不希望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

+0

会不会有任何重复的对,说的如:*(A,X)*实际数据重复一次以上? –

+0

@NickilMaveli让我们说没有 – piRSquared

+0

嗯,我有一个解决方案,甚至可以处理dups。但还没有足够彻底的测试。反正我会写。 –

回答

0

为了您的人为的例子:

排序w.r.t A和B,让该指数的纺丝。稍后,重置索引以作为参考DF

​​

接下来,使用append将A设置为索引以及正常整数索引。对索引进行排序(属于A)。现在重新设置索引。

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

让我们拿B的索引。对获取的索引轴进行排序。

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

enter image description here

+1

非常有创意:-) – piRSquared

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


此刻,我无法弄清楚如何摆脱循环。

相关问题