为了账号安全,请及时绑定邮箱和手机立即绑定

groupby 返回第 n 个组 - NOT 行

groupby 返回第 n 个组 - NOT 行

临摹微笑 2021-07-29 20:15:04
我试图在长(> 2M)行中按两个因素分组。数据背景第二个因素实际上是测试日期 - 对于给定的样本(第一组),可以重新测试样本。然而,测试可以改变样本,因此能够有选择地从第二次测试(或第三次、第四次等)中提取一批测试数据是很有用的。较早的问题和当前代码前段时间我问了一个问题,并得到了一个函数,非常感谢Praveen: 按日期排序和排名,在 Pandas df 中的一个组, 但这非常慢:在 1.2M 行数据集上运行,它有在具有 96GB 内存的 JupyterHub 服务器上花费了 20 多分钟,并且仍在继续。df1 = df.sort_values(['id', 'date'], ascending=[True, False])df1['date_rank'] = df1.groupby(['id'])['date'].transform(lambda x: list(map(lambda y: dict(map(reversed, dict(enumerate(x.unique())).items()))[y]+1,x)) )当前想法不像我的第一个想法那样用数字标记测试日期,感觉这几乎可以通过 cumcount、groupby.nth 或 getgroup 实现 - 但我无法到达那里。有人有任何想法吗?下面的数据集仍然相关:df = pd.DataFrame({'id':[1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,6,6,7,7], 'value':[.01, .4, .5, .7, .77, .1,.2, 0.3, .11, .21, .4, .01, 3, .5, .8, .9, .1],'date':['10/01/2017 15:45:00','10/01/2017 15:45:00','05/01/2017 15:56:00',    '11/01/2017 15:22:00','11/01/2017 15:22:00','06/01/2017 11:02:00','05/01/2017 09:37:00','05/01/2017 09:37:00','05/01/2017 09:55:00',    '05/01/2017 09:55:00','05/01/2017 10:08:00','05/01/2017 10:09:00','03/02/2017 08:55:00',    '03/02/2017 09:15:00','03/02/2017 09:31:00','09/01/2017 15:42:00',    '19/01/2017 16:34:00']})我正在尝试在 date_rank 列中生成类似的数据;虽然我很高兴不生成列,但我只想能够选择包含第二个测试日期数据的行。例如:df.groupby(['id','date'])['value'].unique()返回:id  date               1   05/01/2017 15:56:00           [0.5]    10/01/2017 15:45:00     [0.01, 0.4]2   11/01/2017 15:22:00     [0.7, 0.77]3   05/01/2017 09:37:00      [0.2, 0.3]    06/01/2017 11:02:00           [0.1]4   05/01/2017 09:55:00    [0.11, 0.21]5   05/01/2017 10:08:00           [0.4]    05/01/2017 10:09:00          [0.01]6   03/02/2017 08:55:00           [3.0]    03/02/2017 09:15:00           [0.5]    03/02/2017 09:31:00           [0.8]7   09/01/2017 15:42:00           [0.9]    19/01/2017 16:34:00           [0.1]我希望能够选择(例如)可用的组的第二组,例如:1 - 10/01/2017 15:45:00 [0.01, 0.04]3 - 06/01/2017 11:02:00 [0.1]5 - 05/01/2017 10:09:00 [0.01]6 - 03/02/2017 09:15:00 [0.5]非常感谢任何帮助或想法。
查看完整描述

1 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

你可以reset_index,然后使用GroupBy+ nth:


res = df.reset_index().groupby('id').nth(1)


print(res)


                   date        value

id                                  

1   10/01/2017 15:45:00  [0.01, 0.4]

3   06/01/2017 11:02:00        [0.1]

5   05/01/2017 10:09:00       [0.01]

6   03/02/2017 09:15:00        [0.5]

7   19/01/2017 16:34:00        [0.1]


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号