我正在尝试找到一种方法来使用 pandas 数据框中的多个列来确定排名。这些列可以按不同的顺序贡献,即升序或降序,并且可以具有不同的类型,即 int 或 str。
我尝试将列数据放入元组中,然后使用排名方法对它们进行排名。但是,这仅提供两列的升序或降序排名。
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)
我希望输出如下所示,其中字符串按升序考虑,整数按降序考虑
# 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
这是一种方法。您可以根据自己的喜好调整升序
以对列(或任意数量的列)进行排序:
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
我问了类似的question在此基础上概括了对多种类型的列进行排名的想法,您可以检查它以表彰找出答案的人。
我是一名优秀的程序员,十分优秀!