首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫-可连接pd.Intervals的长度

熊猫-可连接pd.Intervals的长度
EN

Stack Overflow用户
提问于 2022-06-03 11:53:19
回答 1查看 56关注 0票数 0

我们从一个间隔轴开始,它被分成长5的箱子。(0,5),(5,10),.有一个时间戳列,它有一些时间戳>= 0。通过使用pd.cut(),可以确定与时间戳对应的区间bin。(例如“时间戳”= 3.0 -> "time_bin“=(0,5))。

如果有一个没有相应时间戳的time bin,则它不会出现在interval列中。因此,"time_bin“栏可能存在间隔间隙,例如(5,10),(15,20)。(即缺少间隔(10,15) //注意时间戳列已排序)

目标是获得一列"connected_interval“,该列指示当前行间隔是否连接到上一行间隔;连接意味着没有间隔间隙,即(0,5)、(5,10)、(10,15)将被分配相同的整数ID)和列"conn_interv_length”,为每个可能最大的连接区间指示间隔的长度。间隔(0,5),(5,10),(10,15 )的间隔为15。

初始的dataframe有列"group_id“、”时间戳“、"time_bin”。应该计算列"connected_interval“和"conn_interv_len”。

注意:任何获得填充连接间隔长度的解决方案都是受欢迎的。

代码语言:javascript
复制
df = pd.DataFrame({"group_id":['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],\
             "timestamp": [0.0, 3.0, 9.0, 24.2, 30.2, 0.0, 136.51, 222.0, 237.0, 252.0],\
             "time_bin": [pd.Interval(0, 5, closed='left'), pd.Interval(0, 5, closed='left'), pd.Interval(5, 10, closed='left'), pd.Interval(20, 25, closed='left'), pd.Interval(30, 35, closed='left'), pd.Interval(0, 5, closed='left'), pd.Interval(135, 140, closed='left'), pd.Interval(220, 225, closed='left'), pd.Interval(235, 240, closed='left'), pd.Interval(250, 255, closed='left')],\
              "connected_interval":[0, 0, 0, 1, 2, 0, 1, 2, 3, 4],\
              "conn_interv_len":[10, 10, 10, 5, 5, 5, 5, 5, 5, 5],\
             })

带有预期输出栏的输入:

代码语言:javascript
复制
  group_id  timestamp    time_bin  connected_interval  conn_interv_len
0        A       0.00      [0, 5)                   0               10
1        A       3.00      [0, 5)                   0               10
2        A       9.00     [5, 10)                   0               10
3        A      24.20    [20, 25)                   1                5
4        A      30.20    [30, 35)                   2                5
5        B       0.00      [0, 5)                   0                5
6        B     136.51  [135, 140)                   1                5
7        B     222.00  [220, 225)                   2                5
8        B     237.00  [235, 240)                   3                5
9        B     252.00  [250, 255)                   4                5
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-03 12:36:30

IIUC,您可以对间隔进行排序,删除重复项,提取左/右界限,根据连续的左/右匹配/不匹配创建组,然后再将输出合并到原始的:

代码语言:javascript
复制
df2 = (df[['group_id', 'time_bin']]
 # extract bounds and sort intervals
 .assign(left=df['time_bin'].array.left,
         right=df['time_bin'].array.right)
 .sort_values(by=['group_id', 'left', 'right'])
 # ensure no duplicates
 .drop_duplicates(['group_id', 'time_bin'])
 # compute connected intervals and connected length
 .assign(connected_interval=lambda d:
          d.groupby('group_id', group_keys=False)
           .apply(lambda g: g['left'].ne(g['right'].shift())
                                     .cumsum().sub(1)),
         conn_interv_len=lambda d:
          (g := d.groupby(['group_id', 'connected_interval']))['right'].transform('max')
          -g['left'].transform('min')
        )
  .drop(columns=['left', 'right'])
)

# merge to restore missing dropped duplicated rows
out = df.merge(df2)

产出:

代码语言:javascript
复制
  group_id  timestamp    time_bin  connected_interval  conn_interv_len
0        A       0.00      [0, 5)                   0               10
1        A       3.00      [0, 5)                   0               10
2        A       9.00     [5, 10)                   0               10
3        A      24.20    [20, 25)                   1                5
4        A      30.20    [30, 35)                   2                5
5        B       0.00      [0, 5)                   0                5
6        B     136.51  [135, 140)                   1                5
7        B     222.00  [220, 225)                   2                5
8        B     237.00  [235, 240)                   3                5
9        B     252.00  [250, 255)                   4                5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72489208

复制
相关文章

相似问题

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