我有以下数据框:
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']
})
我该怎么办?
答案 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