#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'))