我有一只名为DataFrame
的大熊猫df
,按时间顺序排序。每行都是访问网站。
df
有一个名为display
的列,表示访问期间特定页面的显示次数。此列由整数填充,0或更大。
df
也有一个user
列。
我想知道每个用户在看到我感兴趣的关键业务页面之前访问过该网站的次数。
要知道,我需要填充用户索引的Series
,如下所示:
display
非零的第一行的行数(访问次数)(意味着,第一次访问用户看到的页面)答案 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
函数应用于属于每个用户的行