Python 如何计算行中的条目数并在字段更改时重置

Python 如何计算行中的条目数并在字段更改时重置,python,pandas,Python,Pandas,我试图计算每个用户连续打开的电子邮件数量。我有按电子邮件地址和日期排序的数据,可以计算连续打开的#,但我不知道如何在有新电子邮件地址时将其重置为0 in_a_row = [] count = 0 for row in merge['Opened?']: if row == 1: count += 1 in_a_row.append(count) elif row == 0: count = 0 in_a_row.a

我试图计算每个用户连续打开的电子邮件数量。我有按电子邮件地址和日期排序的数据,可以计算连续打开的#,但我不知道如何在有新电子邮件地址时将其重置为0

in_a_row = []
count = 0

for row in merge['Opened?']:
    if row == 1:
        count += 1
        in_a_row.append(count)
    elif row == 0:
        count = 0
        in_a_row.append(count)
merged['in_a_row'] = in_a_row
这就是我目前所拥有的。这会计算一行中打开的数字,但当有新的电子邮件地址时,不会重置为0

in_a_row = []
count = 0

for row in merge['Opened?']:
    if row == 1:
        count += 1
        in_a_row.append(count)
    elif row == 0:
        count = 0
        in_a_row.append(count)
merged['in_a_row'] = in_a_row
下面是它目前的样子

Index   email_address   sent_date      sent_rank  Opened?   in_a_row
0   email_A@gmail.com   5/15/2018          1          1         1
1   email_A@gmail.com   5/23/2018          2          0         0
2   email_A@gmail.com   5/23/2018          3          1         1
3   email_B@gmail.com   5/26/2018          1          1         2
4   email_B@gmail.com   5/27/2018          2          1         3
5   email_B@gmail.com   8/2/2018           3          0         0
6   email_B@gmail.com   8/3/2018           4          1         1
7   email_B@gmail.com   12/12/2018         5          1         2
8   email_C@gmail.com   12/12/2018         1          1         3
9   email_C@gmail.com   2/6/2019           2          0         0
10  email_C@gmail.com   2/12/2019          3          1         1
这就是它应该看起来的样子

Index   email_address   sent_date      sent_rank  Opened?   in_a_row
0   email_A@gmail.com   5/15/2018          1          1         1
1   email_A@gmail.com   5/23/2018          2          0         0
2   email_A@gmail.com   5/23/2018          3          1         1
3   email_B@gmail.com   5/26/2018          1          1         1
4   email_B@gmail.com   5/27/2018          2          1         2
5   email_B@gmail.com   8/2/2018           3          0         0
6   email_B@gmail.com   8/3/2018           4          1         1
7   email_B@gmail.com   12/12/2018         5          1         2
8   email_C@gmail.com   12/12/2018         1          1         1
9   email_C@gmail.com   2/6/2019           2          0         0
10  email_C@gmail.com   2/12/2019          3          1         1
使用lambda使用(
!=
)尝试此使用,并且:

注意:我认为在您想要的输出中可能仍然有一些输入错误。例如,idx
8
9
输入和输出对于
Opened?


[输出]

    Index      email_address   sent_date  sent_rank  Opened?  in_a_row
0       0  email_A@gmail.com   5/15/2018          1        1         1
1       1  email_A@gmail.com   5/23/2018          2        0         0
2       2  email_A@gmail.com   5/23/2018          3        1         1
3       3  email_B@gmail.com   5/26/2018          1        1         1
4       4  email_B@gmail.com   5/27/2018          2        1         2
5       5  email_B@gmail.com    8/2/2018          3        0         0
6       6  email_B@gmail.com    8/3/2018          4        1         1
7       7  email_B@gmail.com  12/12/2018          5        1         2
8       8  email_C@gmail.com  12/12/2018          1        1         1
9       9  email_C@gmail.com    2/6/2019          2        0         0
10     10  email_C@gmail.com   2/12/2019          3        1         1

我没有得到第一次从1更改为0的逻辑(在
行中)。这不是一个新地址吗?当
打开时?
在同一
电子邮件地址处从1变为0,计数器也会重置?另一个问题,为什么所有电子邮件地址都从
0开始计数,但第一个电子邮件地址从
1
开始?表中似乎有一些打字错误,对此表示抱歉,现在应该修好了。什么时候开门0,表示电子邮件在打开时未打开?=1这意味着它被打开了。当电子邮件未打开时,计数器应始终重置为0,但当有新的电子邮件地址时,计数器也应重置为0。电子邮件地址是否总是以这种方式聚集在一起?i、 可以看到电子邮件吗_A@gmail.com电子邮件后_C@gmail.com在第11排或第12排?这非常接近。它确实适用于样本数据,但当我将其应用于更大的数据集时,似乎存在样本数据没有考虑的异常。我更新了索引5,所以这里有一个它不起作用的例子。现在开门了?在索引5处等于0,在索引6处的行应该是0,但它是2。另外,你的打字错误是对的,谢谢你指出。谢谢你指出@Tim344。我会调查一下it@Tim344更新我的答案,如果你想再试一次?