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

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

year_month    pct
201903        50
201903        40
201903         5
201903         5
201904        90
201904         5
201904         5

Я хочу создать логический столбец с именем non-tail, который удовлетворяет следующему условию

df.sort_values(['pct'], ascending=False).groupby('year_month')['pct'].apply(lambda x: x.cumsum().le(80))

, что в non-tail, любое следующее значение в pct, которое будет добавлено, что делает cumsum сразу большим, чем 80, также будет помечено как True, поэтому результат будет выглядеть как

 year_month    pct    non-tail
 201903        50     True
 201903        40     True
 201903         5     False
 201903         5     False
 201904        90     True
 201904         5     False
 201904         5     False

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Что я буду делать

df.pct.iloc[::-1].groupby(df['year_month']).cumsum()>20
Out[306]: 
6    False
5    False
4     True
3    False
2    False
1     True
0     True
Name: pct, dtype: bool
2 голосов
/ 11 июля 2019

IIUC, вам нужно сдвинуть cumsum:

df = df.sort_values(['year_month','pct'], ascending=[True,False])
(df.groupby('year_month')['pct']
   .apply(lambda x: x.cumsum().le(80)
                     .shift(fill_value=True)
         )
)

дает вам:

0     True
1     True
2    False
3    False
4     True
5    False
6    False
Name: pct, dtype: bool
...