微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas – 返回数据框中的第一项,按用户分组

我有很多用户/项目/时间戳数据.我想知道所有用户首先消耗了哪些项目,第二个等等.

我的问题是:如果我有一个已经按时间(降序)排序的数据帧,它是否会认通过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] 举报,一经查实,本站将立刻删除。

相关推荐