У меня загружено множество блогов от мобильных пользователей, и мне нужно создать новый столбец с именем '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