Панды по нескольким столбцам не сортировали значения по умолчанию - PullRequest
2 голосов
/ 10 июля 2019

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

code      pct         year_month
10        6.6156      201905
10        6.0868      201905
10        5.8975      201905
10        11.2195     201905
10        11.1404     201905 

Мне нравится делать следующее

df2 = df.sort_values('pct', ascending=False)
df2['pct'].cumsum().le(20).mean()
0.2

groupby,

df.groupby(['year_month', 'code'])['pct'].apply(lambda x: x.cumsum().le(20).mean())

но результат другой,

year_month  code
201905      BR10    0.6

Я думал, что groupby должен отсортировать pct по убыванию по умолчанию, но, похоже, нет, поэтому мне интересно, как сначала отсортировать pct в каждой группе year_month, code, а затем сделать cumsum; * * тысяча двадцать-один

1 Ответ

2 голосов
/ 10 июля 2019

Ваш код отличается, для того же вывода требуется сортировка по первым 2 столбцам - ['year_month','code'] или в этом примере данных пропустите его (если он уже отсортирован):

print (df['pct'].cumsum().le(20).mean())
0.6

df2 = df.sort_values(['year_month','code'], ascending=False)
print (df2['pct'].cumsum().le(20).mean())
0.6

В groupby значения сортировки в groupby - здесь ['year_month', 'code'], а не pct:

df = df.groupby(['year_month', 'code'])['pct'].apply(lambda x: x.cumsum().le(20).mean())
print (df)
year_month  code
201905      10      0.6
Name: pct, dtype: float64

Так что для одинаковой сортировки выходных данных здесь и по столбцу pct и при необходимости для предотвращения сортировки по 'year_month', 'code'] добавляется sort=False:

df2 = df.sort_values('pct', ascending=False)
print (df2['pct'].cumsum().le(20).mean())
0.2

df = (df.sort_values(['pct'], ascending=False)
        .groupby(['year_month', 'code'], sort=False)['pct']
        .apply(lambda x: x.cumsum().le(20).mean()))
print (df)
year_month  code
201905      10      0.2
Name: pct, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...