我已经在这个问题上停留了3个小时。 我有这样的DF: p =乘积 订单=销售数量
我没有产品的发布日期,因此我认为发布日期是销售量的第一天。
这是我的数据框:
p order
A 0
A 0
A 1
A 1
A 2
B 0
B 0
B 1
B 1
这就是我想要的:自d_s_r列发布以来的天数(发布以来的天数)。
p order d_s_r
A 0 0
A 0 0
A 1 1
A 1 2
A 2 3
B 0 0
B 0 0
B 1 1
B 1 2
您的建议是什么?
我尝试过:
for i, row in data[data.order > 0].groupby('p') :
list_rows = row.index.tolist()
for m, k in enumerate(list_rows):
data.loc[k,'s_d_r'] = m +1
似乎可以正常工作,但是需要太多时间。...
我确定有一个简单的方法,但是找不到ID。 预先感谢...
编辑:
Here's my df :
df = pd.DataFrame([['A',0,0],['A',0,0],['A',12,1],['A',23,5],['A',25,7]
,['B',0,0],['B',2,0],['B',8,5],['B',15,12],['B',0,3],['B',0,3],['B',5,4]], columns=['prod','order','order_2'])
with the df.groupby('prod')['order'].transform(lambda x : x.cumsum().factorize()[0])
我明白了:
prod order order_2 d_s_r
0 A 0 0 0
1 A 0 0 0
2 A 12 1 1
3 A 23 5 2
4 A 25 7 3
5 B 0 0 0
6 B 2 0 1
7 B 8 5 2
8 B 15 12 3
9 B 0 3 3
10 B 0 3 3
11 B 5 4 4
我想在何时:
prod order order_2 d_s_r
0 A 0 0 0
1 A 0 0 0
2 A 12 1 1
3 A 23 5 2
4 A 25 7 3
5 B 0 0 0
6 B 2 0 1
7 B 8 5 2
8 B 15 12 3
9 B 0 3 4
10 B 0 3 5
11 B 5 4 6
通常在每个groupby。('p')的开头都有0,但是我最终可能直接有一些实际值。 而且我可以,某天有0个订单(这里的计数器回到0),但是自产品发布日期起,我仍然想要我的计数器
我实际上设法通过添加仅包含“ 1”的虚拟列并通过执行df [df.o'> 0] .groupby('p')。cumsum()来获得结果,但是我不认为这是真的很有趣...
答案 0 :(得分:2)
{{1}上的groupby
+ p
上的cumsum
和order
factorize
df['d_s_r'] = df.groupby('p')['order'].cumsum().factorize()[0]
print(df)