Панды рассчитывают баллы для каждой группы на основе нескольких функций - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующие значения df,

group_id    code    amount    date
   1        100      20       2017-10-01
   1        100      25       2017-10-02
   1        100      40       2017-10-03
   1        100      25       2017-10-03
   2        101      5        2017-11-01
   2        102      15       2017-10-15
   2        103      20       2017-11-05

. Мне нравится groupby group_id, а затем вычисляются баллы для каждой группы на основе следующих функций:

  1. если code значения одинаковы в группе, в противном случае - 0 и 10;
  2. , если amount сумма> 100, в противном случае - 20 и 0;
  3. sort_valuesна date в порядке убывания и суммируйте различия между датами, если сумма <5, оценка 30, в противном случае 0. </li>

, поэтому результат df выглядит так:

group_id    code    amount    date          score
   1        100      20       2017-10-01     50
   1        100      25       2017-10-02     50
   1        100      40       2017-10-03     50
   1        100      25       2017-10-03     50
   2        101      5        2017-11-01     10
   2        102      15       2017-10-15     10
   2        103      20       2017-11-05     10

Вот функции, которые соответствуют каждой функции выше:

def amount_score(df, amount_col, thold=100):
    if df[amount_col].sum() > thold:
        return 20
    else:
        return 0

def col_uniq_score(df, col_name):
    if df[col_name].nunique() == 1:
        return 0
    else:
        return 10

def date_diff_score(df, col_name):
    df.sort_values(by=[col_name], ascending=False, inplace=True)
    if df[col_name].diff().dropna().sum() / np.timedelta64(1, 'D') < 5:
        return score + 30
    else:
        return score

Мне интересно, как применить эти функции к каждой группе и вычислить сумму всех функций, чтобы получить score.

1 Ответ

0 голосов
/ 30 мая 2018

Вы можете попробовать groupby.transform для того же размера Series, что и оригинал DataFrame с numpy.where для if-else для Series:

grouped = df.sort_values('date', ascending=False).groupby('group_id', sort=False)

a = np.where(grouped['code'].transform('nunique') == 1, 0, 10)
print (a)
[10 10 10  0  0  0  0]

b = np.where(grouped['amount'].transform('sum') > 100, 20, 0)
print (b)
[ 0  0  0 20 20 20 20]

c = np.where(grouped['date'].transform(lambda x:x.diff().dropna().sum()).dt.days < 5, 30, 0)
print (c)
[30 30 30 30 30 30 30]

df['score'] =  a + b + c
print (df)

   group_id  code  amount       date  score
0         1   100      20 2017-10-01     40
1         1   100      25 2017-10-02     40
2         1   100      40 2017-10-03     40
3         1   100      25 2017-10-03     50
4         2   101       5 2017-11-01     50
5         2   102      15 2017-10-15     50
6         2   103      20 2017-11-05     50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...