Pandas:groupby和get第一行匹配条件的索引

时间:2015-02-04 18:58:44

标签: python numpy pandas

我有一只名为DataFrame的大熊猫df,按时间顺序排序。每行都是访问网站。

df有一个名为display的列,表示访问期间特定页面的显示次数。此列由整数填充,0或更大。 df也有一个user列。

我想知道每个用户在看到我感兴趣的关键业务页面之前访问过该网站的次数。

要知道,我需要填充用户索引的Series,如下所示:

    如果用户从未显示页面,则
  • 0
  • 其他,直到display非零的第一行的行数(访问次数)(意味着,第一次访问用户看到的页面)

2 个答案:

答案 0 :(得分:1)

我认为使用普通的ol' argmax:

In [11]: df = pd.DataFrame([[1, 0], [1, 0], [1, 1], [2, 0], [2, 1]], columns=['user', 'display'])

In [12]: df
Out[12]:
   user  display
0     1        0
1     1        0
2     1        1
3     2        0
4     2        1

In [13]: df.groupby('user')['display'].apply(lambda x: np.argmax(x.values))
Out[13]:
user
1       2
2       1
Name: display, dtype: int64

虽然为了清楚起见(或者如果显示器不是布尔值),我会定义一个新列:

In [21]: df['seen'] = df['display'] > 0

In [22]: df.groupby('user')['seen'].apply(lambda x: np.argmax(x.values))
Out[22]:
user
1       2
2       1
Name: seen, dtype: int64

注意:我的旧答案说df.groupby('user')['display'].apply(np.argmax)并不完全正确,因为这会产生第一个真索引

答案 1 :(得分:0)

df.groupby('user').display.apply(nvisits_before_display)

import numpy as np
def nvisits_before_display(x):
    try:
        return np.where(x > 0)[0].item(0) + 1
    except IndexError:
        return 0

这是什么意思?

  • x > 0,当应用于列display时,表示该页面已在给定访问中显示
  • np.where(<condition>)[0]返回numpy.ndarray,其中包含符合条件的索引(有序整数)的位置
  • item(0)是关于获取这些位置中的第一个,这意味着第一次访问页面的位置
  • + 1代表为第一次访问时看到该页面的用户设置值1
  • groupby('user')nvisits_before_display函数应用于属于每个用户的行