首页 文章

捕获行直到第一次响应python中的一个活动

提问于
浏览
2

我有电子邮件活动数据捕获时间,目标和响应(用户是否打开链接) . 响应为1表示用户已打开内容 .

样本数据:

senddate    userid  content  response
2016-06-01  100     50505   NaN
2016-06-01  100     50505   NaN
2016-06-01  100     50505   1
2016-06-01  100     50505   1
2016-06-02  100     50505   NaN
2016-06-02  100     50505   1
2016-06-02  100     50505   1

现在我想只保留行直到第一次响应 . 我想丢弃第一个响应后发生的任何行,我想在多个发送日期执行此操作 .

输出数据集:

senddate    userid  content  response
    2016-06-01  100     50505   NaN
    2016-06-01  100     50505   NaN
    2016-06-01  100     50505   1
    2016-06-02  100     50505   NaN
    2016-06-02  100     50505   1

如果有人可以帮助构建逻辑,那将非常感激 .

1 回答

  • 1

    您可以使用pandas来实现此目的:

    如果'senddate'列上的 groupby 我们可以生成一个布尔掩码,将索引与 first_valid_index 进行比较,这将创建一个多索引,其中第一个级别是日期,第二个级别是valud索引值,然后我们使用 get_level_values 检索它们对于使用 loc 的该级别和索引:

    In [17]:
    import pandas as pd
    df = pd.read_csv(your_file_path)
    df.loc[df.groupby('senddate')['response'].apply(lambda x: x[x.index <= x.first_valid_index()]).index.get_level_values(1)]
    
    Out[17]:
        senddate  userid  content  response
    0 2016-06-01     100    50505       NaN
    1 2016-06-01     100    50505       NaN
    2 2016-06-01     100    50505       1.0
    4 2016-06-02     100    50505       NaN
    5 2016-06-02     100    50505       1.0
    

    以上细分:

    In [18]:
    df.groupby('senddate')['response'].apply(lambda x: x[x.index <= x.first_valid_index()])
    
    Out[18]:
    senddate     
    2016-06-01  0    NaN
                1    NaN
                2    1.0
    2016-06-02  4    NaN
                5    1.0
    Name: response, dtype: float64
    
    In [19]:
    df.groupby('senddate')['response'].apply(lambda x: x[x.index <= x.first_valid_index()]).index.get_level_values(1)
    
    Out[19]:
    Int64Index([0, 1, 2, 4, 5], dtype='int64')
    

相关问题