对不起,不太好的标题可能更糟糕的问题.
我需要在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].