Рейтинг на пользователя в Python - PullRequest
0 голосов
/ 29 октября 2018

У меня загружено множество блогов от мобильных пользователей, и мне нужно создать новый столбец с именем 'hop'.

Итак, ниже, пользователь 47294872934 отправился из Индии (в час 0) в Великобританию (в час 15). Следовательно, их первым местоположением была Индия, а вторым - Великобритания.

Итак, я хотел бы новый столбец, как этот,

                      hour   hop
userid      country       
47294872934 India        0   1
            UK          15   2
82718927392 Portugal     4   3
            Spain        2   2
            UK           0   1

В приведенном выше примере у каждого пользователя есть несколько прыжков. Пользователь 82718927392 путешествовал из Великобритании (1) в Испанию (2) в Португалию (3) в течение дня. Это один день, поэтому, чем выше час, тем позже произошло путешествие.

Я пытался сделать это с помощью ранга (ниже), но он относится ко всему набору данных, а не к одному пользователю. Я также хочу, чтобы ранг был int, а не float.

Любая помощь будет отличной!

In [12]: df2
Out[12]: 
                      hour
userid      country       
47294872934 India        0
            UK          15
82718927392 Portugal     4
            Spain        2
            UK           0

In [13]: df2.rank(ascending=True)
Out[13]: 
                      hour
userid      country       
47294872934 India      1.5
            UK         5.0
82718927392 Portugal   4.0
            Spain      3.0
            UK         1.5

Включая примеры

    In [32]: df2 = df.groupby(['userid', 'country'])[['hour']].min().groupby(level=0).cumcount()+1

In [33]: df2['hop'] = df2.sort_values('hour').groupby(level=0).cumcount()+1
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-34-27bb4b4b86fa> in <module>()
----> 1 df2['hop'] = df2.sort_values('hour').groupby(level=0).cumcount()+1

~/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in sort_values(self, axis, ascending, inplace, kind, na_position)
   2444         """
   2445         inplace = validate_bool_kwarg(inplace, 'inplace')
-> 2446         axis = self._get_axis_number(axis)
   2447 
   2448         # GH 5856/5853

~/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in _get_axis_number(self, axis)
    373                 pass
    374         raise ValueError('No axis named {0} for object type {1}'
--> 375                          .format(axis, type(self)))
    376 
    377     def _get_axis_name(self, axis):

ValueError: No axis named hour for object type <class 'pandas.core.series.Series'>

Дальнейшие испытания

    ...: df['hop'] = df.groupby(level=0).hour.rank(method='dense').astype(int)

In [36]: df
Out[36]: 
         userid   country      date  hour  hop
0   82718927392        UK  20101025     0    1
1   82718927392        UK  20101025     1    1
2   82718927392        UK  20101025     1    1
3   82718927392        UK  20101025     1    1
4   82718927392     Spain  20101025     2    1
5   82718927392     Spain  20101025     2    1
6   82718927392     Spain  20101025     2    1
7   82718927392     Spain  20101025     3    1
8   82718927392  Portugal  20101025     4    1
9   82718927392  Portugal  20101025     5    1
10  47294872934     India  20101025     0    1
11  47294872934     India  20101025     0    1
12  47294872934     India  20101025     1    1
13  47294872934        UK  20101025    15    1
14  47294872934        UK  20101025    17    1
15  47294872934        UK  20101025    19    1

1 Ответ

0 голосов
/ 29 октября 2018

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

sort_values + groupby + cumcount

df['hop'] = df.sort_values('hour').groupby(level=0).cumcount()+1

                      hour  hop
userid      country            
47294872934 India        0    1
            UK          15    2
82718927392 Portugal     4    3
            Spain        2    2
            UK           0    1

groupby + rank

df['hop'] = df.groupby(level=0).hour.rank(method='dense').astype(int)

                      hour  hop
userid      country            
47294872934 India        0    1
            UK          15    2
82718927392 Portugal     4    3
            Spain        2    2
            UK           0    1

Если у пользователя одновременно несколько стран, cumcount будет увеличивать счет, а rank - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...