熊猫 - 按连续范围分组

Mos*_*orn 7 python group-by intervals pandas

我有一个具有以下结构的数据帧 - 开始,结束和高度.

数据框的一些属性:

  • 数据帧中的行始终从前一行结束的位置开始,即如果行n的结尾是100,则行n + 1的开始是101.
  • 行n + 1的高度总是不同于行n + 1中的高度(这是数据在不同行中的原因).

我想以一种高度将分组为5个长度的桶的方式对数据帧进行分组,即桶是0,1-5,6-10,11-15和> 15.

请参阅下面的代码示例,其中我正在寻找的是group_by_bucket函数的实现.

我试着查看其他问题,但无法得到我正在寻找的确切答案.

提前致谢!

>>> d = pd.DataFrame([[1,3,5], [4,10,7], [11,17,6], [18,26, 12], [27,30, 15], [31,40,6], [41, 42, 7]], columns=['start','end', 'height'])
>>> d
   start  end  height
0      1    3       8
1      4   10       7
2     11   17       6
3     18   26      12
4     27   30      15
5     31   40       6
6     41   42       7
>>> d_gb = group_by_bucket(d)
>>> d_gb
   start  end height_grouped
0      1   17           6_10
1     18   30          11_15
2     31   42           6_10
Run Code Online (Sandbox Code Playgroud)

B. *_* M. 6

一种方法:

df = pd.DataFrame([[1,3,10], [4,10,7], [11,17,6], [18,26, 12],
[27,30, 15], [31,40,6], [41, 42, 6]], columns=['start','end', 'height'])
Run Code Online (Sandbox Code Playgroud)

使用cut使组:

df['groups']=pd.cut(df.height,[-1,0,5,10,15,1000])
Run Code Online (Sandbox Code Playgroud)

找到断点:

df['categories']=(df.groups!=df.groups.shift()).cumsum()
Run Code Online (Sandbox Code Playgroud)

然后df是:

"""
   start  end  height    groups  categories
0      1    3      10   (5, 10]           0
1      4   10       7   (5, 10]           0
2     11   17       6   (5, 10]           0
3     18   26      12  (10, 15]           1
4     27   30      15  (10, 15]           1
5     31   40       6   (5, 10]           2
6     41   42       6   (5, 10]           2
"""
Run Code Online (Sandbox Code Playgroud)

定义有趣的数据:

f = {'start':['first'],'end':['last'], 'groups':['first']}
Run Code Online (Sandbox Code Playgroud)

并使用groupby.agg功能:

df.groupby('categories').agg(f)
"""
              groups  end start
               first last first
categories                     
0            (5, 10]   17     1
1           (10, 15]   30    18
2            (5, 10]   42    31
"""
Run Code Online (Sandbox Code Playgroud)