我正在查看以下内容,以计算出每个用户在每个位置花费的时间。
效果很好,但问题是显示-4.0
的行。这是一个新用户,这是他们被识别出的第一个国家-直到我看到他们移居国家之前,我无法计算他们到该位置的时间长度。
对于每个用户的第一个位置,我需要将结果设置为用户1的NaN。
这可能吗?
df2['time_in_loc'] = df2['hour'] - df2['hour'].shift(1)
In [36]: df2
Out[36]:
hour hop time_in_loc
userid country
82718927392 UK 0 1 NaN
Spain 2 2 2.0
Portugal 4 3 2.0
47294872934 India 0 1 -4.0
UK 15 2 15.0
答案 0 :(得分:2)
您可以用groupby
来检查diff
df.groupby(level=0).diff()
答案 1 :(得分:0)
如果要使用.shift
方法,则需要首先创建一个掩码,以检查userid
是否相同。由于未为非DateTimeIndex实现.shift
,因此您可以退回到numpy
。 np.roll
将环绕,因此我们定义了自己的.shift
函数,该函数不会环绕。
import numpy as np
def shift(x, n):
return np.concatenate((np.full(n, np.nan), x[:-n]))
m = shift(df2.index.get_level_values(0), 1) == df2.index.get_level_values(0)
df2.loc[m, 'time_in_loc'] = (df2.hour - df2.hour.shift(1))[m]
输出:
hour hop time_in_loc
userid country
82718927392 UK 0 1 NaN
Spain 2 2 2.0
Portugal 4 3 2.0
47294872934 India 0 1 NaN
UK 15 2 15.0