Python pandas при сортировке таблицы выберите возрастание / убывание на основе значения столбца? - PullRequest
0 голосов
/ 23 января 2020

У меня есть df с этими столбцами: время, имя пользователя, aisle_id, seat_id.

Я хочу отсортировать таблицу по:

1-е: время по возрастанию,

2-е: имя пользователя по возрастанию,

3-е: aisle_id по возрастанию,

4th: seat_id, возрастание, когда aisle_id нечетное число, и убывание, когда aisle_id четное.

Я попытался разделить df на df_odd и df_even, отсортировать оба по 4-му правилу, используя df.sort_values, затем concat, затем сортируйте по 1-му, 2-му и 3-му правилу. Однако это нарушает 4-е правило.

Есть ли функция для этого или я сначала пробовал правильно?

1 Ответ

2 голосов
/ 24 января 2020

Вы можете группировать по времени, имени пользователя и aisle_id, а затем сортировать значения по seat_id в каждой группе на основе значений aisle_id.

Для сортировки внутри групп создайте функцию fun c ():

def func(x):
    if (x["aisle_id"].iloc[0]%2 == 0):
        ans = x["seat_id"].sort_values(ascending=False)
    else:
        ans = x["seat_id"].sort_values()
    return ans

Затем сгруппируйте и примените fun c ():

ans = 
df.groupby(["time","username","aisle_id"]).apply(func).reset_index(level=[0,1,2])

Так как groupby автоматически сортирует группы в порядке возрастания, нет необходимости сортировать по времени, имени пользователя и проходу.

Например, для следующего кадра данных

df = pd.DataFrame(columns = ["time","username","aisle_id","seat_id"])
df.loc[:,"time"] = [0, 0, 0, 0, 1, 1, 1, 1]
df.loc[:,"username"] = [0, 0, 1, 1, 2, 2, 3, 3]
df.loc[:,"aisle_id"] = [1, 1, 3, 3, 2, 2, 2, 2]
df.loc[:,"seat_id"] = [0, 1, 3, 1, 1, 2, 3, 4]
print(df)

   time username aisle_id  seat_id
0    0     0        1       0
1    0     0        1       1
2    0     1        3       3
3    0     1        3       1
4    1     2        2       1
5    1     2        2       2
6    1     3        2       3
7    1     3        2       4

вывод

    time username aisle_id  seat_id
0    0      0       1        0
1    0      0       1        1
3    0      1       3        1
2    0      1       3        3
5    1      2       2        2
4    1      2       2        1
7    1      3       2        4
6    1      3       2        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...