首页 > 解决方案 > 在 pandas 数据框中使用不同类型的列进行排名,每列都有升序和降序选项

问题描述

我试图找到一种方法来使用熊猫数据框中的多列来确定排名。这些列可以以不同的顺序贡献,即升序或降序,并且可以具有不同的类型,即 int 或 str。

我试图将列数据放在一个元组中,然后使用 rank 方法对它们进行排名。但是,这仅提供两列的升序或降序排名。

import pandas as pd
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df['tup'] = df.apply(tuple,axis=1)
# For both columns taken into account in ascending order
df['rank'] = df['tup'].rank() 
# For both columns taken into account in descending order
df['rank'] = df['tup'].rank(ascending=False) 

我希望输出是下面的输出,其中将 String 视为升序,将 Integer 视为降序

# Expected 
  String  Integer     tup  rank
0      a        1  (a, 1)   4.0
1      a        2  (a, 2)   3.0
2      a        3  (a, 3)   1.5
3      a        3  (a, 3)   1.5
4      b        1  (b, 1)   5.0

但相反,两列都被视为升序

# Actual
  String  Integer     tup  rank
0      a        1  (a, 1)   1.0
1      a        2  (a, 2)   2.0
2      a        3  (a, 3)   3.5
3      a        3  (a, 3)   3.5
4      b        1  (b, 1)   5.0

标签: pythonpandas

解决方案


这是一种方法。您可以根据需要调整ascending列(或任意数量的列),但是您喜欢:

import pandas as pd
import numpy as np
df = pd.DataFrame(data={'String':['a','a','a','a','b'],'Integer':[1,2,3,3,1]})
df = df.sort_values(['String','Integer'], ascending=[True, False])
df['rank'] = np.arange(len(df)) + 1
df['rank'] = df.groupby(['String', 'Integer'])['rank'].transform('mean')
print(df)

输出:

  String  Integer  rank
2      a        3   1.5
3      a        3   1.5
1      a        2   3.0
0      a        1   4.0
4      b        1   5.0

基于此,我问了一个类似的问题,以概括对多种类型的列进行排名的想法,您可以检查它以感谢提出答案的人。


推荐阅读