在python中捕获活动的行直到第一次响应
我有捕获时间、目标和响应(用户是否打开链接)的电子邮件活动数据。响应为1表示用户已打开内容 样本数据:在python中捕获活动的行直到第一次响应,python,Python,我有捕获时间、目标和响应(用户是否打开链接)的电子邮件活动数据。响应为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
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
如果有人能帮助构建逻辑,我们将不胜感激。您可以使用以下方法来实现这一点:
如果您在“senddate”列上创建一个布尔掩码,将索引与第一个有效索引进行比较,这将创建一个多索引,其中第一级为日期,第二级为有值索引值,然后,我们使用get_level\u值
检索这些值,并使用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
[17]中的
作为pd进口熊猫
df=pd.read\u csv(您的文件路径)
df.loc[df.groupby('senddate')['response'].apply(lambda x:x[x.index@Edchum..非常感谢您的回复…我意识到我有一个小小的修改…如果对于同一个用户,我只想在第一次回复之前捕获行,并放弃所有其他行,而不考虑发送日期…您可以在同一方面帮助我吗?抱歉,但您应该发布另一个问题,而不是在m你的回答解决了你原来的问题,那么你应该接受我只是在这里编辑…因为问题的主题是相同的…只是逻辑上的一个变化…然后做df.groupby('userid')['response'].apply(lambda x:x[x.index谢谢!!…我编辑了这个问题,以便其他人能理解。
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')