基于两列的重组DataFrame

Reorganization DataFrame based on two columns

如果我有一个像这样的数据框


    A   B
0   a   0
1   a   0
2   a   1
3   a   1
4   a   2
5   a   2
6   b   0
7   b   0
8   b   1
9   b   1
10  b   2
11  b   2
12  c   0
13  c   0
14  c   1
15  c   1
16  c   2
17  c   2

有没有办法重新组织两列并将其变成这样?

所以 B 列遵循模式 0,1,2 并且 A 列中的每个元素都在每个位置?



    A   B
0   a   0
1   b   1
2   c   2
3   b   0
4   c   1
5   a   2
6   c   0
7   a   1
8   b   2
9   a   0
10  b   1
11  c   2
12  b   0
13  c   1
14  a   2
15  c   0
16  a   1
17  b   2

你可以这样做:

df.reindex((j+i*6)%len(df) for i in range(6) for j in range(0,len(df),8))

为什么有效?您的第一个 012 的索引是 0816,因此您需要一个步长为 8 的范围。

range(0,len(df),8)

下一个012的索引分别是6144,等于61422%len(df)。相同的模式移动了 6

(j+i*6)%len(df)

6 次以获得整个数据集。

for i in range(6)

Returns :

    A  B
0   a  0
8   b  1
16  c  2
6   b  0
14  c  1
4   a  2
12  c  0
2   a  1
10  b  2
0   a  0
8   b  1
16  c  2
6   b  0
14  c  1
4   a  2
12  c  0
2   a  1
10  b  2

如果需要重置索引:

df.reindex((j+i*6)%len(df) for i in range(6)
                           for j in range(0,len(df),8)
          ).reset_index(drop=True)

Returns

    A  B
0   a  0
1   b  1
2   c  2
3   b  0
4   c  1
5   a  2
6   c  0
7   a  1
8   b  2
9   a  0
10  b  1
11  c  2
12  b  0
13  c  1
14  a  2
15  c  0
16  a  1
17  b  2