Рассчитать показатель положительных значений по группам - PullRequest
1 голос
/ 08 апреля 2020

Я работаю с Pandas DataFrame, имеющим следующую структуру:

import pandas as pd
​
df = pd.DataFrame({'brand' : ['A', 'A', 'B', 'B', 'C', 'C'], 
                   'target' : [0, 1, 0, 1, 0, 1], 
                   'freq' : [5600, 220, 5700, 90, 5000, 100]})
​
print(df)
  brand  target  freq
0     A       0  5600
1     A       1   220
2     B       0  5700
3     B       1    90
4     C       0  5000
5     C       1   100

Для каждого бренда я хотел бы рассчитать соотношение положительных целей, например, для бренда A, процентное соотношение положительная цель - 220 / (220 + 5600) = 0,0378.

Мой итоговый DataFrame должен выглядеть следующим образом:

  brand  target  freq   ratio
0     A       0  5600  0.0378
1     A       1   220  0.0378
2     B       0  5700  0.0156
3     B       1    90  0.0156
4     C       0  5000  0.0196
5     C       1   100  0.0196

Я знаю, что должен сгруппировать свой DataFrame по марке, а затем применить некоторую функцию к каждой группе (так как я хочу сохранить все строки в моем конечном результате я думаю, что я должен использовать преобразование здесь). Я проверил несколько вещей, но безуспешно. Любая помощь приветствуется.

1 Ответ

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

Сначала сортировка столбцов по brand и target для последней 1 строки в группе, а затем деление на GroupBy.transform с лямбда-функцией:

df = df.sort_values(['brand','target'])
df['ratio'] = df.groupby('brand')['freq'].transform(lambda x: x.iat[-1] / x.sum())
print (df)
  brand  target  freq     ratio
0     A       0  5600  0.037801
1     A       1   220  0.037801
2     B       0  5700  0.015544
3     B       1    90  0.015544
4     C       0  5000  0.019608
5     C       1   100  0.019608

Или деление Ряды, созданные функциями GroupBy.last и GroupBy.sum:

df = df.sort_values(['brand','target'])
g = df.groupby('brand')['freq']
df['ratio'] = g.transform('last').div(g.transform('sum'))
...