Группировка, сечение и сортировка в сечении в Python - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующие данные:

player_id   broadcast_month_id  runs_tier
67          201803              100s
67          201803              400s
67          201802              50s
67          201802              100s
67          201801              50s
67          201712              50s
67          201711              50s
67          201710              50s
67          201709              50s
67          201708              50s
67          201707              50s
67          201706              50s
67          201705              50s
67          201704              50s
67          201704              Others

Я хочу выяснить последний показатель run_tier каждого игрока в наборе данных (этот образец содержит только 1 игрока, но в исходном наборе данных содержится около 500 игроков)

После прочтения данных я группирую по player_id, а затем сечу по месяцам и подсчитываю количество месяцев на каждом уровне, как показано ниже:

run_tier = df_tier.pivot_table(index=['player_id'],columns=['runs_tier'],aggfunc='count',fill_value=0)\
                    .xs('broadcast_month_id', axis=1, drop_level=True)

Я могу получить уровень, на котором игрок провел максимальное количество месяцев, как показано ниже:

run_tier['latest'] = df_tier.sort_values('player_id').groupby('player_id')['runs_tier'].tail(1).values

Как получить последний уровень проигрывателя? В соответствии с приведенными выше данными, это последние игроки Run_tier составляет 100 с Может кто-нибудь помочь мне с этим?

household_id    100s    400s    50s Others  latest
67          2       1       11  1       100s

В случае дубликатов, таких как первые 2 записи, я выбираю самую верхнюю после сортировки по дате.

Ответы [ 2 ]

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

Рассмотрим сначала создание последнего столбца в df_tier с groupby().transform(), затем выполните pivot_table без необходимости .xs(), после чего следует новое присвоение столбца в условно фильтрованномgroupby().min:

# NEW COLUMN FOR LATEST broadcast_month_id
df_tier['latest'] = df_tier.groupby('player_id')['broadcast_month_id'].transform('max')

# PIVOT TABLE (with values arg)
run_tier = df_tier.pivot_table(index='player_id', columns='runs_tier', 
                               values='broadcast_month_id',
                               aggfunc='count', fill_value=0).rename_axis(None)

# NEW COLUMN FOR MIN runs_tier IN LATEST broadcast_month_id
run_tier['latest'] = df_tier[df_tier['latest']==df_tier['broadcast_month_id']]\
                           .groupby('player_id')['runs_tier'].min()

print(run_tier)
# runs_tier  100s  400s  50s  Others latest
# 67            2     1   11       1   100s
0 голосов
/ 08 мая 2018

Если я правильно понимаю ...

Сначала мы должны иметь возможность отсортировать runs_tier, поэтому давайте сделаем его числовым, убрав s и установив Others в nan

>>> df
    broadcast_month_id  player_id runs_tier
0               201803         67      100s
1               201803         67      400s
2               201802         67       50s
3               201802         67      100s
4               201801         67       50s
..                 ...        ...       ...
10              201707         67       50s
11              201706         67       50s
12              201705         67       50s
13              201704         67       50s
14              201704         67    Others

[15 rows x 3 columns]

>>> df['numeric_tier'] = pd.to_numeric(df['runs_tier'].apply(lambda x: x[:-1]), errors='coerce')
>>> df
    broadcast_month_id  player_id runs_tier  numeric_tiers
0               201803         67      100s        100.000
1               201803         67      400s        400.000
2               201802         67       50s         50.000
3               201802         67      100s        100.000
4               201801         67       50s         50.000
..                 ...        ...       ...            ...
10              201707         67       50s         50.000
11              201706         67       50s         50.000
12              201705         67       50s         50.000
13              201704         67       50s         50.000
14              201704         67    Others            nan

[15 rows x 4 columns]

Теперь мы можем отсортировать фрейм данных, так что первое появление каждого игрока - это самый последний верхний уровень

df = df.sort_values(['player_id', 'broadcast_month_id', 'numeric_tiers'], ascending=[True, False, True])

и выберите только это первое появление:

>>> df = df[~df.duplicated('player_id')]
>>> df
   broadcast_month_id  player_id runs_tier  numeric_tiers
0              201803         67      100s        100.000

и тогда мы можем присоединиться к нему

>>> run_tier['lastest'] = df.set_index('player_id')['runs_tier'] 
>>> run_tier
runs_tier  100s  400s  50s  Others lastest                                                                                       
player_id                                                                                                                        
67            2     1   11       1    100s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...