熊猫:groupby +条件+遍历一列

时间:2020-04-20 16:47:41

标签: python pandas dataframe increment

我已经在这个问题上停留了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()来获得结果,但是我不认为这是真的很有趣...

1 个答案:

答案 0 :(得分:2)

{{1}上的groupby + p上的cumsumorder

factorize

df['d_s_r'] = df.groupby('p')['order'].cumsum().factorize()[0]
print(df)