pandas: групповое + условие + итерация по столбцу - PullRequest
1 голос
/ 20 апреля 2020

Я застрял на 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

, кажется, работает, но это занимает слишком много времени ....

я уверен, что есть это простой способ, но не могу найти идентификатор. заранее спасибо ...

Редактировать:

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

обычно имеют 0 в начале каждой группы. ('P'), но я мог бы в конечном итоге получить непосредственно некоторые фактические значения. И я могу иметь 0 ордеров однажды (что возвращает счетчик 0 здесь), но все еще хочу мой счетчик с даты выпуска продукта


Мне действительно удалось получить свои результаты, добавив фиктивный столбец только с "1" и делающий df [df.o '> 0] .groupby (' p '). cumsum (), но я не думаю, что это действительно интересно ...

1 Ответ

2 голосов
/ 20 апреля 2020

groupby в p + cumsum в order с factorize

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

   p  order  d_s_r
0  A      0      0
1  A      0      0
2  A      1      1
3  A      1      2
4  A      2      3
5  B      0      0
6  B      0      0
7  B      1      1
8  B      1      2
...