Вычислите минимальное значение определенного столбца для всех групп и вычтите значение из всех значений определенного столбца этой группы

#pandas #group-by #pandas-groupby

Вопрос:

 df = pd.DataFrame([['2018-02-03',42],
                   ['2018-02-03',22],
                   ['2018-02-03',10],
                   ['2018-02-03',32],
                   ['2018-02-03',10],
                   ['2018-02-04',8],
                   ['2018-02-04',2],
                   ['2018-02-04',12],
                   ['2018-02-03',20],
                   ['2018-02-05',30],
                   ['2018-02-05',5],
                   ['2018-02-05',15]])
df.columns = ['product','date','quantity']
 

Я хочу создать группы по дате и вычислить минимальное значение столбца «количество» для всех групп соответственно и вычесть значение из всех значений столбца «количество» этой группы. Желаемый результат -:

 day         value
2018-02-03  32                #(because, 42-10 = 32), 10 is minimum for date 2018-02-03.
2018-02-03  12
2018-02-03  0
2018-02-03  22
2018-02-03  0
2018-02-04  6
2018-02-04  0
2018-02-04  10
2018-02-03  10
2018-02-05  25
2018-02-05  0
2018-02-05  10
 

Теперь вот что я попробовал:

 df = df.groupby('Date', as_index = True)
datamin = df.groupby('Date')['quantity'].min()
 

Но это создает фрейм данных с первым количеством по дате, и я также не знаю, как поступить после этого!!

Ответ №1:

попробуйте через groupby() и transform() :

 df['value']=df.groupby('date')['quantity'].transform(lambda x:x-x.min())
 

выход из df :

     date         quantity   value
0   2018-02-03      42      32
1   2018-02-03      22      12
2   2018-02-03      10      0
3   2018-02-03      32      22
4   2018-02-03      10      0
5   2018-02-04      8       6
6   2018-02-04      2       0
7   2018-02-04      12      10
8   2018-02-03      20      10
9   2018-02-05      30      25
10  2018-02-05      5       0
11  2018-02-05      15      10
 

Ответ №2:

Для повышения производительности используйте GroupBy.transform без лямбда-функции, лучше вычесть все значения столбца, такие как:

 df['value'] = df['quantity'].sub(df.groupby('date')['quantity'].transform('min'))