Как найти первое вхождение для каждого идентификатора на основе столбца datetime с pandas? - PullRequest
3 голосов
/ 07 августа 2020

Я видел много похожих вопросов, но не нашел ответа на свою проблему. Скажем, у меня есть df:

    sample_id     tested_at   test_value
            1    2020-07-21            5
            1    2020-07-22            4
            1    2020-07-23            6
            2    2020-07-26            6
            2    2020-07-28            5
            3    2020-07-22            4
            3    2020-07-27            4
            3    2020-07-30            6 

df уже отсортирован по возрастанию по столбцу tested_at. Теперь мне нужно добавить еще один столбец first_test, который будет указывать первое тестовое значение для каждого sample_id в каждой строке, независимо от того, является ли оно самым высоким или нет. Результат должен быть:

    sample_id     tested_at   test_value   first_test
            1    2020-07-21            5            5
            1    2020-07-22            4            5
            1    2020-07-23            6            5
            2    2020-07-26            6            6
            2    2020-07-28            5            6
            3    2020-07-22            4            4
            3    2020-07-27            4            4
            3    2020-07-30            6            4

df также довольно большой, поэтому более быстрый способ будет очень полезен.

1 Ответ

1 голос
/ 07 августа 2020

Вы можете использовать pandas 'groupby для группировки по идентификатору образца, а затем использовать метод transform для получения первого значения для каждого идентификатора образца. Обратите внимание, что это принимает первое значение по номеру строки, а не первое значение по дате, поэтому убедитесь, что строки упорядочены по дате.

df = pd.DataFrame(
    [
        [1, "2020-07-21", 5],
        [1, "2020-07-22", 4],
        [1, "2020-07-23", 6],
        [2, "2020-07-26", 6],
        [2, "2020-07-28", 5],
        [3, "2020-07-22", 4],
        [3, "2020-07-27", 4],
        [3, "2020-07-30", 6],
    ],
    columns=["sample_id", "tested_at", "test_value"],
)

df["first_test"] = df.groupby("sample_id")["test_value"].transform("first")

В результате получается:

   sample_id   tested_at  test_value  first_test
0          1  2020-07-21    5           5
1          1  2020-07-22    4           5
2          1  2020-07-23    6           5
3          2  2020-07-26    6           6
4          2  2020-07-28    5           6
5          3  2020-07-22    4           4
6          3  2020-07-27    4           4
7          3  2020-07-30    6           4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...