【问题标题】:Group dataframe by separation in intervals按间隔对数据帧进行分组
【发布时间】:2019-01-26 06:29:52
【问题描述】:

我有一个数据框,该数据框具有间隔和与每个相关联的标签。我需要对按给定距离分隔的行进行分组和聚合。

例如,开始/结束在其他行的开始/结束的 3 个单位内的组行将其label 字段连接起来:

In [16]: df = pd.DataFrame([
    ...:     [ 1, 3,'a'], [ 4,10,'b'],
    ...:     [15,17,'c'], [18,20,'d'],
    ...:     [27,30,'e'], [31,40,'f'], [41,42,'g'],
    ...:     [50,54,'h']],
    ...:     columns=['start', 'end', 'label'])
    ...:

In [17]: df
Out[17]:
   start  end label
0      1    3     a
1      4   10     b
2     15   17     c
3     18   20     d
4     27   30     e
5     31   40     f
6     41   42     g
7     50   54     h

期望的输出:

In [18]: df_desired = group_by_interval(df)
In [19]: df_desired
Out[19]:
   start  end  label
0      1   10    a b
1     15   20    c d
2     27   30  e f g
3     50   54      h

如何使用数据框按间隔执行这种分组?

我找到了一个类似的 SO here,但它有点不同,因为我不知道在哪里切先验

【问题讨论】:

  • 是否保证一行的start: end 不会与另一行的start: end 重叠?如果您可以在上面的DataFrame 中添加类似z 33:34 的内容,它可能会变得复杂
  • 不是……我想我可能想为此提出另一个问题……
  • 是的,情况很复杂。

标签: python pandas dataframe aggregate


【解决方案1】:

可以根据条件创建grouper并聚合

grouper = ((df['start'] - df['end'].shift()) > 3).cumsum()

df.groupby( grouper).agg({'start' : 'first', 'end' : 'last', 'label': lambda x: ' '.join(x)})

    start   end     label
0   1       10      a b
1   15      20      c d
2   27      42      e f g
3   50      54      h

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2021-07-07
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多