pandas - 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
解决方案
下面的函数将返回按 ID 和 Category 分组的最小值
df=df.groupby(["ID","Category"], group_keys=False).apply(lambda g: g.nsmallest(1, "Date"))
推荐阅读
- overlay - 覆盖资产操作栏的“属性”按钮
- swift - 如何在 Xcode 10 (macOS) 的 Storyboard 中将 NSArrayController 绑定到应用程序委托上的属性?
- python-3.x - 扫描字符串文字时出现python语法错误EOL
- python - 单击单独文件中的命令
- drupal - Drupal 8 删除额外的 div 并在菜单中添加自定义类
- php - 每次我尝试安装 php-mysqli 扩展时,我都会收到类似“E:Package 'php-mysqli' has no installation Candidate”之类的错误
- c# - Asp.net Ajax MVC 登录重定向到主页不起作用
- python - 如何在 Pyspark 中使用重复键 countByValue?
- android - Android RemoveViewAt 不删除每个视图
- ios - Swift PHAsset 图像请求问题