首页 > 解决方案 > Pandas Groupby:获取最早日期的 ID 的所有行(具有许多 ID 的大型数据集)

问题描述

我有一个 df 框架,其中包含一个 ID 及其相关列的每月值。ID 和月份有“组”行。每个 ID 最多可能有 12 个月的数据。我想要所有 ID 的所有数据行,其中月份是每个 ID 的最早日期

数据看起来像

    +-------+----+--------+-------------+-------------+----------+
| index | ID |  Date  |      X      |      Y      | Category |
+-------+----+--------+-------------+-------------+----------+
|     0 |  1 | 1/1/18 | 0.118758835 | 0.954677438 | A        |
|     1 |  1 | 1/1/18 | 0.148103273 | 0.976617504 | B        |
|     2 |  1 | 1/1/18 | 0.365541214 | 0.551642346 | C        |
|     3 |  1 | 1/2/18 | 0.405002687 | 0.343279097 | A        |
|     4 |  1 | 1/2/18 | 0.130580643 | 0.144486528 | B        |
|     5 |  1 | 1/2/18 | 0.395113106 | 0.113118681 | C        |
|     6 |  2 | 1/1/18 | 0.425580038 | 0.725166189 | A        |
|     7 |  2 | 1/1/18 | 0.889677796 | 0.386824338 | B        |
|     8 |  2 | 1/1/18 | 0.835311629 | 0.363802849 | C        |
|     9 |  2 | 1/2/18 | 0.8375818   | 0.769265522 | A        |
|    10 |  2 | 1/2/18 | 0.648162611 | 0.075286355 | B        |
|    11 |  2 | 1/2/18 | 0.639060695 | 0.791222309 | C        |
+-------+----+--------+-------------+-------------+----------+

我想知道是否可以使用 Groupby 处理数据以输出

    +-------+----+--------+-------------+-------------+----------+
| index | ID |  Date  |      X      |      Y      | Category |
+-------+----+--------+-------------+-------------+----------+
|     0 |  1 | 1/1/18 | 0.118758835 | 0.954677438 | A        |
|     1 |  1 | 1/1/18 | 0.148103273 | 0.976617504 | B        |
|     2 |  1 | 1/1/18 | 0.365541214 | 0.551642346 | C        |
|     6 |  2 | 1/1/18 | 0.425580038 | 0.725166189 | A        |
|     7 |  2 | 1/1/18 | 0.889677796 | 0.386824338 | B        |
|     8 |  2 | 1/1/18 | 0.835311629 | 0.363802849 | C        |
+-------+----+--------+-------------+-------------+----------+

``

NB 已将输出 df 中的索引号保留为相同以显示我想要获取的行

注意:每个 ID 有不同数量的类别,即不能只获取 n 行 - 必须为每个 ID 使用最早的月份

我编写了一个 python 循环,它遍历每个 id,然后选择日期最早的行,但是对于 2+ GB 的大型数据集,它非常慢。希望这是足够的信息。

如果 Groupby 不适合,那么欢迎使用其他方法

更新:

我对此进行了更多调查并提出了一个解决方案,
请参阅 StackOverflow Pandas groupby 排名日期时间

使用 groupby 和 rank 在 ID 级别创建 DateRank 列

  df['DateRank'] = df.groupby('ID')['Date'].rank(method='dense', ascending=True)

过滤排名 1(第一个条目)

xdf = df[df['DateRank'] == 1.0 ]

移除排名列

xdf.drop('DateRank', axis=1, inplace=True)

打印数据框

xdf

标签: pandaspandas-groupby

解决方案


下面的函数将返回按 ID 和 Category 分组的最小值

df=df.groupby(["ID","Category"], group_keys=False).apply(lambda g: g.nsmallest(1, "Date"))

推荐阅读