【问题标题】:Pandas group by window rangePandas 按窗口范围分组
【发布时间】:2021-10-02 05:27:55
【问题描述】:

我有如下数据表:

values
======
2.0
2.5
3.2 
7.0
7.8
9.0
11.0

我想在某个窗口中提取组,例如

window_size = 1.0

此距离内的所有值应成为一组:

values   group
======   ====
2.0      1
2.5      1
3.2      1
7.0      2
7.8      2
9.0      3
11.0     4

3.2 和 2.0 属于一组,因为 2.5 在它们之间并且在窗口大小 1.0 以下的两侧。

如何使用 pandas 实现这一目标?

Edit1(更复杂的示例返回错误组,答案如下):

windows_size= 1000000
value          group    correct_group
65951649.0     1        1  
59397882.0     1        2
7633231.0      1        3 
7638485.0      1        3
68085447.0     2        4
67973423.0     2        4

Edit2 后续问题,是否可以按另一个组分组: Pandas group by window range (Follow up question with category)

【问题讨论】:

  • 最后一个例子中的窗口大小是多少?
  • 对不起,我忘了,1000000

标签: python pandas group-by


【解决方案1】:

IIUC 使用diffcumsum

window_size = 1.0
df["group"] = df["values"].diff().abs().gt(window_size).cumsum()+1
print (df)

   values  group
0     2.0      1
1     2.5      1
2     3.2      1
3     7.0      2
4     7.8      2
5     9.0      3
6    11.0      4

【讨论】:

  • 谢谢,我试过了,但在另一个例子中,分组似乎不正确。
  • @honeymoon - 使用df["group"] = df["value"].diff().abs().gt(windows_size).cumsum()+1
  • 是否可以将它与第二组结合起来(见我的第二次编辑)?
  • @honeymoon - 可以为它发布新问题吗?
  • 请停止使用新数据一遍又一遍地更新您的问题。上面的答案也符合您的新数据。如果您发现需要处理的极端情况,请提出新问题。
【解决方案2】:

您可以使用 pandas diff 创建组

df['group'] = (df['values'].diff().abs().fillna(100) > window_size).astype(int).cumsum()

这里的填充值应该是大于window_size的数字

输出:

   values  group
0     2.0      1
1     2.5      1
2     3.2      1
3     7.0      2
4     7.8      2
5     9.0      3
6    11.0      4

【讨论】:

  • 谢谢,我试过了,但在另一个例子中,分组似乎不正确。
猜你喜欢
  • 2021-10-02
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多