Python Сортировка по оценке условий, затем сортировка по отдельным столбцам - PullRequest
0 голосов
/ 23 января 2020

Я хочу упорядочить данные. Есть 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. Если индикатор_1 = 'Y', показать эти строки в первую очередь. Теперь, когда эти строки являются первыми, отсортируйте их по количеству убывших Если индикатор_1 = 'N', эти строки еще не показаны вообще
  2. Если индикатор_2 = 'Y', покажите эти строки вторыми. Сортировать по количеству людей по убыванию.
  3. Если индикатор_2 = 'N' (тот же индикатор, что и № 2 выше) И индикатор_3 = 'N', покажите эти строки третьими. Сортировать по количеству людей по убыванию.
  4. Если индикатор_2 = 'N' (тот же индикатор, что и № 2 выше) И индикатор_3 = 'Y', покажите эти строки четвертыми. Сортировать по количеству людей по убыванию.

Другой вариант, который я думаю, - создать отдельные субкадры и объединить их? Не уверен, что самый эффективный вариант.

1 Ответ

0 голосов
/ 23 января 2020

У вас есть ошибка в ваших данных, ожидаемый результат, у вас есть 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. Выберите Indicator1 == Y для одной сортировки; затем Indicator1 == 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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...