【发布时间】:2015-03-27 18:31:25
【问题描述】:
我有一列包含这样的值列表:
100
200
300
500
600
650
1000
我想做一个Groupby(或类似的有效构造)来获取每行的值在最后一行的100范围内的行。
在这种情况下,上述示例产生的批次将是
100, 200, 300,
500, 600, 650
1000
这可以在 Pandas 中实现吗?由于 Pandas 尝试允许类似 SQL 的查询,我猜应该是这样。
【问题讨论】:
我有一列包含这样的值列表:
100
200
300
500
600
650
1000
我想做一个Groupby(或类似的有效构造)来获取每行的值在最后一行的100范围内的行。
在这种情况下,上述示例产生的批次将是
100, 200, 300,
500, 600, 650
1000
这可以在 Pandas 中实现吗?由于 Pandas 尝试允许类似 SQL 的查询,我猜应该是这样。
【问题讨论】:
您可以使用类似于this question 答案中描述的方法。这基本上是一个三步过程:
shift 计算您要区分的行间标准。cumsum 对这个标准求和,以创建一个新系列,其中每个组的单个值的单独“块”。这是一个例子:
>>> x = pandas.Series([100, 200, 300, 500, 600, 650, 1000, 900, 750])
>>> x.groupby(((x - x.shift()).abs() > 100).cumsum()).apply(list)
0 [100, 200, 300]
1 [500, 600, 650]
2 [1000, 900]
3 [750]
dtype: object
请注意,我使用了标准 > 100,这与您提到的 <= 100 标准相反。使用这种方法,您需要使用分隔组的标准,而不是加入它们的标准,因此您必须使用分组标准的否定。
【讨论】: