def groupby_moving_sum_threshold(x, threshold):
groups = []
group_idx, total = 0, 0
for n in x:
total += n
if total > threshold:
group_idx += 1
total = n
groups.append(group_idx)
return groups
df = pd.DataFrame([{"row_id": 'a', "value": 2}, {"row_id": 'b', "value": 6}, {"row_id": 'c', "value": 2}, {"row_id": 'c', "value": 7}, {"row_id": 'c', "value": 3}])
sum = 0
START_DATE = 1
date = START_DATE # date at fist row
def func(row):
global sum
global date
sum += row.value
if row.name == 0: # skip first row
return START_DATE
if sum >= 8: # reset threshold increase date
sum = 0
date += 1
return date
df["date"] = START_DATE # initialize to START_DATE
df["date"] = df.apply(func, axis=1) # apply function row-wise
print(df.to_string())```
3条答案
按热度按时间4c8rllxm1#
所以基本上你有以下输入:
并希望创建组,这些组可能编码如下:
您可以使用以下函数,该函数可能未进行优化(普通for循环):
它提供了良好的结果:
如果
x
输入是pandas数据框的一列,则使用它创建一个新列group
。基于这个新专栏,你将能够实现你想要的:
6ojccjat2#
下面是一个组合pandas/numpy的选项:
输出:
bttbmeg03#
你可以利用pandas的apply方法。
这是一个简单的例子,其中日期是一个整数,但可以相当容易地修改为您所需的日期格式。