Python 数据帧交错重排序

Python 数据帧交错重排序,python,pandas,Python,Pandas,很抱歉这个不太好的标题和可能更糟糕的问题 我需要在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

很抱歉这个不太好的标题和可能更糟糕的问题

我需要在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, 1], 'b': array([46,  7]), 'c': array([14, 19])}
i、 e


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

如果要进行排序,以便看到值的所有第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,1,2,2]
->
[0,1,2]

通过在开始时以不同的方式创建
数据帧,您可以一起跳过重新排序。您可以使用
np.tile
np.repeat
的组合,而不仅仅是使用
itertools.product

import pandas as pd
import numpy as np

a = [0, 1] 
b = np.array([46, 7])
c = np.array([14, 19])

d = list(zip(np.tile(a, len(b)*len(c)), 
             np.tile(np.repeat(b, len(a)), len(c)), 
             np.repeat(c, len(a)*len(b))))

pd.DataFrame(d, columns=['a', 'b', 'c'])
#   a   b   c
#0  0  46  14
#1  1  46  14
#2  0   7  14
#3  1   7  14
#4  0  46  19
#5  1  46  19
#6  0   7  19
#7  1   7  19

df.sort_值(['c','b','a'])
您的案例仍然退化;如果只对“a”列中出现的第n个值进行排序,它们都会给出相同的输出。你能给出一个更复杂的例子(比如第二列在什么地方被洗牌)并用文字解释一下你想要完成什么吗?@DSM我会试试,但我相信第二个例子不是退化的。看看索引。对于每个值
a
可以执行,我需要对所有第一次出现的值进行分组,然后对第二次出现的值进行分组,等等(a可以执行任意数量的值,但每个值具有相同的出现次数)@ALollz仅
a
列很重要,请参见第二列example@filippo:是的
df.loc[df.groupby(“a”).cumcount().sort_values().index]
生成相同的输出,与b列和c列无关。。。但你的最后一句话让人觉得你只关心a专栏?谢谢,+1!我肯定会研究一下,但我担心计算所有确实使用
itertools.product
的组合的代码有点复杂,并且处理了大量的怪癖。虽然我很想远离字典,在代码路径中使用一些可以预测的排序,但恐怕现在还得等待。
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
import pandas as pd
import numpy as np

a = [0, 1] 
b = np.array([46, 7])
c = np.array([14, 19])

d = list(zip(np.tile(a, len(b)*len(c)), 
             np.tile(np.repeat(b, len(a)), len(c)), 
             np.repeat(c, len(a)*len(b))))

pd.DataFrame(d, columns=['a', 'b', 'c'])
#   a   b   c
#0  0  46  14
#1  1  46  14
#2  0   7  14
#3  1   7  14
#4  0  46  19
#5  1  46  19
#6  0   7  19
#7  1   7  19