Python 按评估条件排序,然后按单独的列排序



我希望对数据帧进行排名排序。我想对 4 组条件进行排名,然后对于每个条件,按列 x "# 人"降序对数据帧进行排序。

我的数据帧输入:

Product indicator_1 indicator_2 indicator_3 #_people
A        Y            Y          Y           500
B        Y            N          N           600
C        N            Y          N           1000
D        N            Y          N           5000
E        N            Y          Y           200
F        N            N          Y           500
G        N            N          N           600
H        N            N          N           500

预期输出:

Product indicator_1 indicator_2 indicator_3 #_people
B        Y            N          N           600
A        Y            Y          Y           500
D        N            Y          N           5000
C        N            Y          N           1000
E        N            Y          Y           200
G        N            N          N           600
H        N            N          N           500
F        N            N          Y           700

例如:

  1. 如果 indicator_1 = 'Y',则首先显示这些行。现在这些行是第一行,请按 # 人降序对它们进行排序。如果 indicator_1 = 'N',则这些行根本不显示
  2. 如果 indicator_2 = 'Y',则依次显示这些行。按 # 人降排序。
  3. 如果 indicator_2 = 'N'
  4. (与上面的 #2 指示符相同(和 indicator_3 = 'N',则第三行显示这些行。按 # 人降排序。
  5. 如果 indicator_2 = 'N'(与上面的 #2 指示符相同(和 indicator_3 = 'Y',则显示这些行的第四行。按 # 人降排序。

我正在考虑的另一种选择是创建单独的子数据帧,然后将它们合并?不确定最有效的选择。

你的数据有误,预期的输出,你有一个700,它来自哪里?

您尝试解决的问题不是一步排序问题。您给出的条件在某种程度上是矛盾的:

1st condition indicator_1=="Y", you want to ascending sort Num_people, 
2nd condition indicator_1=="N", you want to descending sort indicator_2

这是我的方法。您需要执行两个步骤: 1. 先排序Indicator_1 2. 选择指标1==Y,进行一种排序;然后指标 1==N 进行另一种排序。

import pandas as pd
Product_ = ["A", "B", "C", "D", "E", "F", "G", "H"]
indicator_1 = ["Y", "Y", "N", "N", "N", "N", "N", "N"]
indicator_2 = ["Y", "N", "Y", "Y", "Y", "N", "N", "N"]
indicator_3 = ["Y", "N", "N", "N", "Y", "Y", "N", "N"]
Num_people = [500, 600, 1000, 5000, 200, 500, 600, 500]
df = pd.DataFrame({"Product_": Product_, "indicator_1": indicator_1, "indicator_2": indicator_2, "indicator_3": indicator_3, "Num_people": Num_people})
# print(df)
#  Product indicator_1 indicator_2 indicator_3 #_people
# A        Y            Y          Y           500
# B        Y            N          N           600
# C        N            Y          N           1000
# D        N            Y          N           5000
# E        N            Y          Y           200
# F        N            N          Y           500
# G        N            N          N           600
# H        N            N          N           500
temp = df.sort_values(["indicator_1", "Num_people"], ascending = [False, False])
temp_1 = temp[temp.indicator_1=="Y"]
temp = pd.concat([temp_1, temp[temp.indicator_1=="N"].sort_values(["indicator_2", "indicator_3", "Num_people"], ascending = [False, True, False])])
print(temp)

输出为:

Product_ indicator_1 indicator_2 indicator_3  Num_people
1        B           Y           N           N         600
0        A           Y           Y           Y         500
3        D           N           Y           N        5000
2        C           N           Y           N        1000
4        E           N           Y           Y         200
6        G           N           N           N         600
7        H           N           N           N         500
5        F           N           N           Y         500

希望这有帮助。

最新更新