Панды сортируют значения в каждой группе после суммирования по группам и получают процент значений после использования cumsum - PullRequest
1 голос
/ 09 июля 2019

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

amount    id    year_month
20        10    201903
20        10    201903
50        20    201903
10        20    201903
 5        30    201903
 5        40    201903
30        50    201904
10        60    201904
10        70    201904
 5        80    201904

Я хочу groupby id и year_month и получить sum из amount сначала,

df_1 = df.groupby(['id', 'year_month'], as_index=False)['amount'].sum()

затем разделите эту сумму amount на amount сумму year_month groupby,

df_1['pct']=df_1['amount'].div(df_1.groupby('year_month')['amount'].transform('sum')).mul(100).round(2)

amount    id    year_month  pct
40        10    201903      36.36
60        20    201903      54.55
 5        30    201903      4.55
 5        40    201903      4.55
30        50    201904      54.55
10        60    201904      18.18
10        70    201904      18.18
 5        80    201904      9.09

Я хочу сначала отсортировать pct в каждом year_month (например,201903) в порядке убывания;затем вычислите процент id с, чья общая сумма pct меньше или равна 80 в каждом year_month;Мне интересно, каков наилучший способ сделать это, и результат будет выглядеть (используя year_month значения в качестве заголовков);

201903    201904
25%       50%

1 Ответ

1 голос
/ 09 июля 2019

Функция groupby по умолчанию сортирует по группам столбцов, поэтому sort_values следует опустить.Затем используйте пользовательскую лямбда-функцию с кумулятивной суммой, сравните на Series.le и для процента True с используйте mean, в последний раз конвертируйте Series в один столбец DataFrame на Series.to_frame с DataFrame.T для транспонирования:

df_2 = (df_1.groupby('year_month')['pct']
            .apply(lambda x: x.cumsum().le(80).mean())
            .mul(100)
            .to_frame(0)
            .T
            .astype(int))

print (df_2)
year_month  201903  201904
0               25      50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...