我有很多用户/项目/时间戳数据.我想知道所有用户首先消耗了哪些项目,第二个等等.
我的问题是:如果我有一个已经按时间(降序)排序的数据帧,它是否会默认通过groupby进程排序?并且,即使用户没有消耗两个项目,我如何拉出任何用户消耗的前两个项目?
import pandas as pd
df = pd.DataFrame({'item_id': ['b', 'b', 'a', 'c', 'a', 'b'], 'user_id': [1,2,1,1,3,1], 'time': range(6)})
print df
pd.get_dummies(df['item_id'])
gp = df.groupby('user_id').head()
print gp
# Return item_id of first one installed in each case ??
这给出了:
item_id time user_id
0 b 0 1
1 b 1 2
2 a 2 1
3 c 3 1
4 a 4 3
5 b 5 1
item_id time user_id
user_id
1 0 b 0 1
2 a 2 1
3 c 3 1
5 b 5 1
2 1 b 1 2
3 4 a 4 3
现在,我需要提取前两个item_id值,类似这样(但保留user_id列不是必需的):
user_id order item_id
1 0 b
1 1 a
2 0 b
3 0 a
解决方法:
这是一个黑客:
In [75]: def nth_order(x, n):
....: xn = x[:n]
....: return xn.join(Series(arange(len(xn)), name='order', index=xn.index))
....:
In [76]: df.groupby('user_id').apply(lambda x: nth_order(x, 2))
Out[76]:
item_id time user_id order
user_id
1 0 b 0 1 0
2 a 2 1 1
2 1 b 1 2 0
3 4 a 4 3 0
请注意,您不能只使用n,因为您可能有一个组len(group)< 2,因此
len(x [:n])!= n
在每种情况下(根据您的问题).
这是pandas中这种特殊切片的一个特征:如果切片在这里传递结束,你将获得每一行(并且可能没有n行),而对于iloc
indexing,则不是这样.也就是说,如果您尝试切片超过数组的末尾,则会引发异常.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。