Python Pandas максимальное значение столбца в зависимости от общего условия - PullRequest
0 голосов
/ 28 июня 2018

У меня есть таблица, которая выглядит так:

My table

Я пытаюсь выяснить, что такое «first_stop» и «last_stop» для каждого «id» на основе «sequence». Я сделал first_stop, но я не могу понять последнюю остановку. Поэтому мне нужен дополнительный столбец, в котором указано, является ли это максимальным порядковым номером для каждого идентификатора. Я пробовал так много способов, и все они заканчиваются неудачей или дают мне некоторые ошибки. Я потратил слишком много времени, пытаясь решить эту проблему, и я знаю, что вы все сможете помочь мне очень быстро. Спасибо за вашу помощь.

for index, row in df.iterrows():
    first_mask = df['sequence'] == 0
    last_mask = df['sequence'] == ???
    df['first_stop'] = np.where(first_mask, 'Y', 'N')
    df['last_stop'] = np.where(last_mask, 'Y', 'N')
print(df[['id', 'sequence', 'first_stop', 'last_stop']])

Последовательность - это порядок остановок, поэтому я хочу наименьший порядковый номер (first_stop) для каждого идентификатора и максимальный порядковый номер (last_stop) для каждого идентификатора. Самый младший порядковый номер легко, он всегда равен 0. Но как рассчитать максимальный порядковый номер для каждого идентификатора?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Учитывая, что ваш DataFrame, похоже, уже отсортирован по ['id', 'sequence'], вам просто нужно сдвинуть, как было указано в комментариях, чтобы проверить последнюю строку, где изменяется id.

df['last_stop'] = df.id != df.id.shift(-1)

Выходы:

    id  sequence  last_stop
0    2         0      False
1    2         1       True
2    3         0      False
3    3         1      False
4    3         2      False
5    3         3       True
6    4         0      False
7    4         1       True
8    5         0      False
9    5         1       True
10   6         0       True
11   7         0       True
12   8         0      False
13   8         1       True

Если он не отсортирован, вы можете выполнить сортировку до и применить ту же логику. Иначе об этом позаботится одно преобразование:

df['last_stop'] = df.groupby('id').sequence.transform(lambda x: x == max(x))
0 голосов
/ 28 июня 2018

Хорошо, я решил это сам, так что вот что я сделал. Это довольно просто, и я чувствую себя глупо, что не понял этого раньше.

Дайте мне знать, если у кого-то есть лучшее решение.

Я создал строку, которая подсчитывает общее количество остановок:

df['stop_count'] = df.groupby('id')['id'].transform('count') - 1

Затем я проверил, соответствует ли порядковый номер stop_count:

last_mask = df['sequence'] == df['stop_count']

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