按组中的位置排序数据帧,然后按该组排序

时间:2017-01-09 11:59:07

标签: python pandas numpy

考虑数据框df

df = pd.DataFrame(dict(
        A=list('aaaaabbbbccc'),
        B=range(12)
    ))

print(df)

    A   B
0   a   0
1   a   1
2   a   2
3   a   3
4   a   4
5   b   5
6   b   6
7   b   7
8   b   8
9   c   9
10  c  10
11  c  11

我想对数据帧进行排序,如果我按列'A'分组,我会从每个组中拉出第一个位置,然后循环返回并从每个组中获取第二个位置(如果还有剩余的话)。等等。

我希望结果看起来像这样

    A   B
0   a   0
5   b   5
9   c   9
1   a   1
6   b   6
10  c  10
2   a   2
7   b   7
11  c  11
3   a   3
8   b   8
4   a   4

2 个答案:

答案 0 :(得分:4)

您可以先groups使用cumcount计算值,然后Series cum sort_values reindex使用enter image description here

cum = df.groupby('A')['B'].cumcount().sort_values()
print (cum)
0     0
5     0
9     0
1     1
6     1
10    1
2     2
7     2
11    2
3     3
8     3
4     4
dtype: int64

print (df.reindex(cum.index))
    A   B
0   a   0
5   b   5
9   c   9
1   a   1
6   b   6
10  c  10
2   a   2
7   b   7
11  c  11
3   a   3
8   b   8
4   a   4

答案 1 :(得分:2)

这是一种NumPy方法 -

def approach1(g, v):
    # Inputs : 1D arrays of groupby and value columns
    id_arr2 = np.ones(v.size,dtype=int)
    sf = np.flatnonzero(g[1:] != g[:-1])+1
    id_arr2[sf[0]] = -sf[0]+1
    id_arr2[sf[1:]] = sf[:-1] - sf[1:]+1
    return id_arr2.cumsum().argsort(kind='mergesort')

示例运行 -

In [246]: df
Out[246]: 
    A   B
0   a   0
1   a   1
2   a   2
3   a   3
4   a   4
5   b   5
6   b   6
7   b   7
8   b   8
9   c   9
10  c  10
11  c  11

In [247]: df.iloc[approach1(df.A.values, df.B.values)]
Out[247]: 
    A   B
0   a   0
5   b   5
9   c   9
1   a   1
6   b   6
10  c  10
2   a   2
7   b   7
11  c  11
3   a   3
8   b   8
4   a   4

或使用@jezrael's post中的df.reindex

df.reindex(approach1(df.A.values, df.B.values))