首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有条件地按列分组,并在逐行操作的基础上对熊猫数据进行转换?

如何有条件地按列分组,并在逐行操作的基础上对熊猫数据进行转换?
EN

Stack Overflow用户
提问于 2020-05-10 02:21:03
回答 1查看 45关注 0票数 0

我有一张熊猫数据df的表格:

代码语言:javascript
复制
  id    start_time    end_time    label
  1      0               2         A
  1      3               6         C
  1      9               11        A
  2      0               4         B
  2      5               7         A
  3      1               10        C
  3      20              22        A
  3      22.5            24        A 

我希望根据end_time(当前行)-start_time(上一行)<=阈值的条件按列id分组,然后在新的数据帧中将相应的时间和标签作为列表。实际上,对于阈值= 2,转换df之后的新数据应该如下所示:

代码语言:javascript
复制
  id    times                    labels
  1     [(0,2), (3,6)]           [A, C]  
  1     [(9,11)]                 [A] 
  2     [(0,4), (5,7)]           [B, A] 
  3     [(1,10)]                 [C]
  3     [(20,22), (22.5, 24)]    [A, A] 

实现这一目标的有效的、仿生的方法是什么?

生成示例df的代码:

代码语言:javascript
复制
df = pandas.DataFrame([[1,0, 2, 'A'],[1, 3,6,'C'],[1,9,11,'A'],[2,0,4,'B'],[2,5,7,'A'],[3,1,10,'C'],[3,20,22,'A'],[3,22.5,24,'A']],columns=['id', 'start_time', 'end_time', 'label'])
EN

Stack Overflow用户

发布于 2020-05-10 02:35:20

我们需要使用groupbyshift来创建子组键,然后我们只需使用agg完成groupby

代码语言:javascript
复制
s=df.groupby('id').apply(lambda x : (x.start_time-x.end_time.shift(1)).gt(1).cumsum()).reset_index(level=0,drop=True)
df['times']=list(zip(df.start_time,df.end_time))
df_out=df.groupby([df.id,s]).agg({'times':list,'label':list})
df_out
                         times   label
id                                    
1  0      [(0.0, 2), (3.0, 6)]  [A, C]
   1               [(9.0, 11)]     [A]
2  0      [(0.0, 4), (5.0, 7)]  [B, A]
3  0               [(1.0, 10)]     [C]
   1  [(20.0, 22), (22.5, 24)]  [A, A]
票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61706381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档