Python 基于多列的数据帧排序

Python 基于多列的数据帧排序,python,python-3.x,pandas,dataframe,ranking,Python,Python 3.x,Pandas,Dataframe,Ranking,如何根据2列对数据帧进行排序 在下面的示例中,colu\u b将为col\u a设置连接断路器 数据帧: df = pd.DataFrame({'col_a':[0,0,0,1,1,1], 'col_b':[5,2,8,3,7,4]}) df col_a col_b 0 0 5 1 0 2 2 0 8 3 1 3 4 1 7 5 1 4 col_a col_

如何根据2列对数据帧进行排序

在下面的示例中,
colu\u b
将为
col\u a
设置连接断路器

数据帧:

df = pd.DataFrame({'col_a':[0,0,0,1,1,1], 'col_b':[5,2,8,3,7,4]})

df
   col_a  col_b
0      0      5
1      0      2
2      0      8
3      1      3
4      1      7
5      1      4
   col_a  col_b  Rank
0      0      5   2
1      0      2   1
2      0      8   3
3      1      3   4
4      1      7   6
5      1      4   5
预期输出:

df = pd.DataFrame({'col_a':[0,0,0,1,1,1], 'col_b':[5,2,8,3,7,4]})

df
   col_a  col_b
0      0      5
1      0      2
2      0      8
3      1      3
4      1      7
5      1      4
   col_a  col_b  Rank
0      0      5   2
1      0      2   1
2      0      8   3
3      1      3   4
4      1      7   6
5      1      4   5

找到了我自己的解决方案:创建一个包含列的元组并对其进行排序。 不会处理不同的升序/降序,但这有助于解决我的问题

df['rank'] = df[['col_a','col_b']].apply(tuple, 1).rank()

这里有一个方法。通过对列进行排序并重新编制索引来创建临时数据框。然后使用新索引作为秩,并连接回原始df

temp_df = df.sort_values(['col_a', 'col_b']).reset_index()
temp_df['rank'] = temp_df.index + 1
print(temp_df)
#   index  col_a  col_b  rank
#0      1      0      2     1
#1      0      0      5     2
#2      2      0      8     3
#3      3      1      3     4
#4      5      1      4     5
#5      4      1      7     6
'index'
对应于原始数据帧中的索引。使用此选项将
temp_df
连接回
df
并选择所需的列:

df = df.join(temp_df.set_index('index'), rsuffix="_r")[['col_a', 'col_b', 'rank']]
print(df)
#   col_a  col_b  rank
#0      0      5     2
#1      0      2     1
#2      0      8     3
#3      1      3     4
#4      1      7     6
#5      1      4     5

这里是一种使用
排序\u值的单行方法

In [135]: df['rank'] = df.sort_values(['col_a', 'col_b'])['col_b'].index + 1

In [136]: df
Out[136]: 
   col_a  col_b  rank
0      0      5     2
1      0      2     1
2      0      8     3
3      1      3     4
4      1      7     6
5      1      4     5

这段代码背后的逻辑:基本上,
DataFrame.sort\u values
函数接受多个列名,并根据传递的列名顺序返回数据帧的排序副本。默认的排序顺序是升序,这是我们想要的。如果需要另一个顺序,可以将该顺序作为布尔值的iterable传递给
升序
关键字参数。最后,
列b
的新索引是我们想要的(加上一个)。

使用
numpy
的方法


您可以使用中间分组执行类似的操作。i、 e.
col\u a\u Rank
并对其进行分组,然后对其进行排序
col\u b
以获得最终的
Rank
值。我试图避免排序。不确定它如何影响大数据帧上的性能。但解决方案非常有效。我将根据我给出的解决方案进行测试,以检查哪一个更快。根据您的数据帧,您可能需要先重置索引。与此答案类似: