Python-根据组中的条件运行计数

时间:2018-07-19 23:53:12

标签: python count

我有以下数据框:

DELETE i
    FROM invitations i JOIN
         users u
         ON i.user_id = u.user_id
    WHERE u.role IN (1, 2, 3) AND
          i.invited_at < NOW() - INTERVAL 3 DAY;

通过唯一的“ ID”,我想按运行计数将行分组在一起,直到“ End”字符串出现在“按钮”列中。例如,分配给ID ='C'的5行应分为两组(1和2),因为有两行包含'End'。 ID ='D'不应分组,因为没有分配给ID ='D'且行为'End'的行。

data = pd.DataFrame({
'ID': ['A','A','A','B','B','C','C','C','C','C','D','E','E','F'], 
'Button': ['Begin','Begin','End','Begin','End','Begin','End','Begin','Begin','End','Begin','Begin','End','End']
}) 

我该怎么办?

1 个答案:

答案 0 :(得分:1)

IIUC,我们可以先将每个“结束”设为1,然后将其他所有内容设为NaN。然后,对于每个ID组,我们可以取累加和(计算结束数)并回填以将所有开始数设置为适当的数字。最后,我们可以用0填充所有剩余的NaN,因为在这种情况下,组中没有任何Ends。

IOW:

In [263]: ends = (data["Button"] == "End").replace(False, np.nan)

In [264]: data["Count"] = ends.groupby(data["ID"]).apply(
          lambda x: x.cumsum().bfill()).fillna(0).astype(int)

In [265]: data
Out[265]: 
   ID Button  Count
0   A  Begin      1
1   A  Begin      1
2   A    End      1
3   B  Begin      1
4   B    End      1
5   C  Begin      1
6   C    End      1
7   C  Begin      2
8   C  Begin      2
9   C    End      2
10  D  Begin      0
11  E  Begin      1
12  E    End      1
13  F    End      1