Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中捕获活动的行直到第一次响应_Python - Fatal编程技术网

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

在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

我有捕获时间、目标和响应(用户是否打开链接)的电子邮件活动数据。响应为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
如果有人能帮助构建逻辑,我们将不胜感激。

您可以使用以下方法来实现这一点:

如果您在“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')