python - 在 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
解决方案
这是一种方法。您可以根据需要调整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
基于此,我问了一个类似的问题,以概括对多种类型的列进行排名的想法,您可以检查它以感谢提出答案的人。
推荐阅读
- excel - 遍历图像列表,如果找不到则使用回退?
- python - 这个 MySQL 查询是否等同于这个 Django 查询
- sql - 在oracle中将字符串转换为所需的时间戳格式
- pandas - 数据帧连接中的错误“预期元组,得到 str”
- c++ - 在 c++ 中将一长串字符转换为 uint32_t 或 uint64_t
- javascript - 如何使用 JavaScript 为每两个数字添加空格?
- ios - Apple App Site Association 在 Postman 中工作,但不适用于在线验证器
- regex - bash 上的 grep 正则表达式/通配行为
- r - 为什么我没有得到 R 中带有 sum 函数的列的总数?
- c# - 如何使 C# 方法中的代码作用于计时器?