我有两列: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
......