簡體   English   中英

熊貓:groupby並獲取第一行匹配條件的索引

[英]Pandas: groupby and get index of first row matching condition

我有一個名為df的熊貓DataFrame ,按時間順序排序。 每一行都是對網站的訪問。

df有一個名為display的列,指示在訪問期間顯示特定頁面的次數。 此列由0或更大的整數填充。 df也有一個user列。

我想知道每個用戶訪問該網站多少次才看到我感興趣的關鍵業務頁面。

要知道這一點,我需要一個用戶索引的Series填充如下:

  • 如果用戶從不顯示頁面,則為0
  • 否則,直到display為非零的第一行為止的行數(即訪問次數)(即用戶看到該頁面的第一次訪問)

我認為使用普通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)不太正確,因為這給出了第一個True 索引

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函數應用於屬於每個用戶的行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM