python – 如果值相同,则对第二个变量进行排序但具有均匀分布

我有两列:Coland,Col2在一个pandas数据帧中. Col1的编号从1到100,Col2的编号为0和1.

我想以这样的方式对这个数据帧进行排序,即行按Col1排序.在我的情况下,我有几百万行,所以绝对Col1值将重复多次.

我可以执行data = data.sort_values(‘Col1’)来根据Col1对值进行排序.例如,这可以给出:

Col1 Col2 ... OR ... Col1 Col2 ... OR ... Col1 Col2
100  0               100  1               100  0
100  0               100  1               100  0
100  1               100  1               100  0
100  0               100  1               100  0
100  1               100  0               100  1
100  1               100  0               100  1
100  1               100  0               100  1
100  0               100  0               100  1
99   1               99   1               99   1
...                  ...                  ...

根据我使用的排序算法(快速排序,合并排序等),当Col1 = 100时,Col2可能有许多可能的分布.

在我的Col1是相同值的部分中,我希望我的Col2的分布是统一的,如下所示:

Col1 Col2
100  0
100  1
100  0
100  1
100  0
100  1
100  0
100  1
99   1
...

是否有任何排序方法python / numpy / pandas / [任何其他库]可以做到这一点?算法的任何想法都可以做到这一点?

最佳答案 您必须在每组的开头为0和1生成良好等级:

df=pd.DataFrame({'col1':randint(0,100,1000),'col2':randint(0,2,1000),}) 
df.sort_values(['col1','col2'],inplace=True)
cnt= df.groupby(['col1','col2']).col1.count()
df['rk']=np.hstack([list(range(n)) for n in cnt])
df.sort_values(['col1','rk'],inplace=True)

一些解释:

首先排序df:

df.sort_values(['col1','col2'],inplace=True)

然后计算每个值:

cnt= df.groupby(['col1','col2']).col1.count()

排名:

df['rk']=np.hstack([list(range(n)) for n in cnt])

解决方案是:

df.sort_values(['col1','rk'],inplace=True)

使用df = pd.DataFrame({‘col1’:randint(0,100,1000),’col2’:randint(0,2,1000),}):

     col1  col2  rk
161     0     0   0
1       0     1   0
253     0     0   1
118     0     1   1
471     0     0   2
391     0     1   2
582     0     0   3
444     0     1   3
579     0     1   4
735     0     1   5
887     0     1   6
111     1     0   0
57      1     1   0
......
点赞