python – pandas dataframe interleaved reordering

对不起,不太好的标题可能更糟糕的问题.

我需要在pandas数据帧上执行一个超级简单的操作,但我显然错过了它的调用方式,因此无法找到正确的搜索关键字.

给出类似的数据帧

   a   b   c
0  0  46  14
1  0   7  14
2  0  46  19
3  0   7  19
4  1  46  14
5  1   7  14
6  1  46  19
7  1   7  19

我需要重新排序行以获取

   a   b   c
0  0  46  14
4  1  46  14
1  0   7  14
5  1   7  14
2  0  46  19
6  1  46  19
3  0   7  19
7  1   7  19

另一个简单但可能不那么含糊的例子.我想从中得到

   a
0  0
1  0
2  1
3  1
4  2
5  2

   a
0  0
2  1
4  2
1  0
3  1
5  2

编辑:关于完整图片的一些澄清

对于它的价值,第一个例子中的数据帧是字典的笛卡尔积

'a': [0, 1], 'b': array([46,  7]), 'c': array([14, 19])}

[{'a': 0, 'b': 46, 'c': 14},
 {'a': 0, 'b': 7, 'c': 14},
 {'a': 0, 'b': 46, 'c': 19},
 {'a': 0, 'b': 7, 'c': 19},
 {'a': 1, 'b': 46, 'c': 14},
 {'a': 1, 'b': 7, 'c': 14},
 {'a': 1, 'b': 46, 'c': 19},
 {'a': 1, 'b': 7, 'c': 19}]

我需要对其进行排序,以便对于每个参数组合,所有值都被分组并循环在一起.

最佳答案 如果要进行排序,以便所有第0次看到值都是第一次,然后是第1次,依此类推,则可以对感兴趣的列进行分组并对累计计数进行排序:

In [119]: df.loc[df.groupby("a").cumcount().sort_values(kind='mergesort').index]
Out[119]: 
   a
0  0
2  1
4  2
1  0
3  1
5  2

这是因为

In [120]: df.groupby("a").cumcount()
Out[120]: 
0    0
1    1
2    0
3    1
4    0
5    1
dtype: int64

In [121]: df.groupby("a").cumcount().sort_values(kind='mergesort')
Out[121]: 
0    0
2    0
4    0
1    1
3    1
5    1
dtype: int64

请注意,我们使用kind =’mergesort’来保证稳定性,如果您想转向[1,2,2,0,0,1] – >,如果需要,您可以先对原始帧进行排序. [0,0,1,1,2,2] – > [0,1,2,0,1,2].

点赞