【问题标题】:How to Sort/Rank a Pandas Dataframe based on multiple columns如何根据多列对 Pandas 数据框进行排序/排名
【发布时间】:2020-04-23 06:28:16
【问题描述】:

我有一个熊猫表,例如:

Entries Col1    Col2    Col3    Col4
Entry1  -1.46   93.93   3.33    92.51   
Entry2  -48.59  31.49   -22.97  80.25
Entry3  8.24    95.85   -5.05   90.29

我想根据所有 4 列对条目进行排序。第 1 列和第 3 列应按更接近 0 的顺序排列,第 2 列和第 4 列应按最高数排列。

目前我有这样的事情:

data.sort_values(cols, ascending=[False,True,False,True],inplace=True)

但这只是按第一列排序,而其他列对排序无关紧要。我需要按所有列对条目进行排序。如果条目 1 仅在第 1 列中最好,条目 2 在其他 3 中最好,则条目 3 应排在最前面。

预期输出:

Entries Col1    Col2    Col3    Col4
Entry1  -1.46   93.93   3.33    92.51   
Entry3  8.24    95.85   -5.05   90.29
Entry2  -48.59  31.49   -22.97  80.25

条目 1 在 Col:1,3 和 4 中最好 条目 2 在所有列中都更差 条目 3 在 Col2 中最好,在其他中第二。

谢谢。

【问题讨论】:

  • 你能添加你的预期输出吗?
  • 您能显示示例表的输出吗?您想单独对列进行排序而不取整行吗?还是按所有列的权重进行排序?
  • 我相信您的排序目标在问题中不是很清楚。您说“接近 0”​​,但您对该列进行排序而不采用绝对值。也许您想要做的是根据您的目标获取各个列的百分位排名,然后在新列中平均这些排名并对新列进行排序?
  • 我已经添加了预期的输出。问题是我有一个很大的条目和值列表。这些值的值都在 -100 和 +100 之间,我需要根据它们的整体排序/排名对行进行排序 - 创建一个基于所有其他列的附加列“排名”将是一个好主意,但我只能目前独立排序

标签: python pandas sorting multiple-columns rank


【解决方案1】:

从创建2个辅助列开始,Col1aCol3a持有 各个源列的绝对值:

data['Col1a'] = data.Col1.abs()
data['Col3a'] = data.Col3.abs()

你的 DataFrame 的排序:

data.sort_values(['Col1a', 'Col2', 'Col3a',  'Col4'],
    ascending=[True, False, True, False], inplace=True)

请注意,ascending 参数与您的代码中的不同。

最后,删除辅助列:

data.drop(columns=['Col1a', 'Col3a'], inplace=True)

【讨论】:

  • 我看到了获取绝对值的必要性,但是如果我的完整数据集中有 21 列,那么您的答案会不会出现第 1 列的排序影响其他列的排序的相同问题?
  • sort_values 对所有通过的列进行排序,但它们的顺序很重要。首先排序是在第一个通过的列上。但是,如果两行中这些列的值相等,则对第二列执行额外的排序(依此类推)。
  • 我明白了,问题不在于值相同,而是一个条目在第 1 列中可能是“最佳”,但在其他列中排名较低。即使总体上它不是最好的,但实际上是最差的“参赛作品”之一,这仍会将其置于顶部。
  • 是的,普通的 sort_values 就是这样工作的。考虑编写一个“排名函数”,根据所有列计算 一个 排名。然后,添加一列 - 此函数的结果并仅在此(单个)列上排序。
  • 是的,我今天一直在考虑这个问题。只是缺乏如何从多个列创建排名的知识。
猜你喜欢
  • 2020-02-29
  • 2019-03-07
  • 2016-11-17
  • 2020-06-18
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2010-11-20
相关资源
最近更新 更多