我有捕获时间、目标和响应(用户是否打开链接)的电子邮件事件数据。响应 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
如果有人可以帮助构建逻辑,我们将不胜感激。
最佳答案
您可以使用 pandas
实现这一目标:
如果您在 'senddate' 列上 groupby
我们可以生成一个 bool 掩码,将索引与 first_valid_index
进行比较,这将创建一个多索引,其中第一级是日期,第二层是有效的索引值,然后我们使用 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')
关于python - 捕获行直到第一次响应 python 中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784795/