首页 > 解决方案 > 如何根据熊猫的日期时间列查找每个 id 的第一次出现?

问题描述

我已经看到了很多类似的问题,但并没有完全找到我的具体问题的答案。假设我有一个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 也很大,因此非常感谢更快的方法。

标签: pythonpandas

解决方案


您可以使用 pandas'groupby按样本 ID 分组,然后使用该transform方法获取每个样本 ID 的第一个值。请注意,这将按行号获取第一个值,而不是按日期获取第一个值,因此请确保行按日期排序。

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

推荐阅读