这是我的数据框中包含的示例行:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "3652b5d7-55b8-4bee-82b6-ab32d5543352",
"timestamp" : "1559403699899",
"endFlow" : "true"
}
我通过'sessionId'进行分组,这将给我这样的分组:
Row 1:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "usecaseId1",
"timestamp" : "1559403699899",
"endFlow" : "false"
},
Row 2:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "usecaseId1",
"timestamp" : "1559403699899",
"endFlow" : "false"
},
Row 3:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "usecaseId2",
"timestamp" : "1559403699899",
"endFlow" : "true"
},
Row 4:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "usecaseId1",
"timestamp" : "1559403699899",
"endFlow" : "false"
},
Row 5:
{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "usecaseId1",
"timestamp" : "1559403699899",
"endFlow" : "true"
}
以上面的组为例,我要在这里实现的是,按“ sessionId”对数据帧进行分组后,我想循环通过具有相同“ useCaseId”的连续行(因此,从上面的组中,我要循环的三组连续行,
Row1-Row2,Row3,Row4-Row5 )
并且从上述每个连续的行集中( Row1-Row2,Row3,Row4-Row5(其中每组具有相同的useCaseId),
我想仅以false查找行尾流值的集合数。
因此,从上面给出的分组示例中,预期结果如下:
1(因此,具有相同useCaseId'usecaseId1'的Row1-Row2的尾流只有'false',而'Row3'和'Row4-Row5'的尾流只有'true')
我该如何实现?
更新:
df.head():
sessionId useCaseId timestamp endFlow
0 sessionId1 useCaseId1 1559403699899 false
1 sessionId1 useCaseId1 1559403699899 false
2 sessionId1 useCaseId2 1559403699899 true
3 sessionId1 useCaseId1 1559403699899 false
4 sessionId1 useCaseId1 1559403699899 true
我尝试过的事情:
我曾尝试通过'sessionId'和'usecaseId'对数据帧进行分组,但这无法正常工作,因为它将以'usecaseId'唯一地对数据帧进行分组,这不是我想要的,我想在通过'分组'之后遍历连续的行sessionId与“ usecaseId”相同,然后将具有相同“ useCaseId”且“ endFlow”仅作为“ false”的连续行计数。
预期输出:
按'sessionId'分组后,我想将具有'endFlow'的相同'useCaseId'的连续行的数量计为'false'
从上面给出的分组示例中,预期结果如下:
1(因此,具有相同useCaseId'usecaseId1'的Row1-Row2的尾流只有'false',而'Row3'和'Row4-Row5'的尾流只有'true')
答案 0 :(得分:2)
您可以尝试这样做:(我假设df.endFlow
包含字符串'true'
和'false'
。如果包含布尔值True
和False
,您只需执行replace
命令。)
df.endFlow.replace({'true': True, 'false': False}).groupby([df.sessionId, df.useCaseId.ne(df.useCaseId.shift()).cumsum()]).sum().eq(False).sum()
Out[1258]: 1
现在,我将您的样本更改为包括两个满足条件的组,它还会正确报告以下计数:
df1:
sessionId useCaseId timestamp endFlow
0 sessionId1 useCaseId1 1559403699899 false
1 sessionId1 useCaseId1 1559403699899 false
2 sessionId1 useCaseId2 1559403699899 true
3 sessionId1 useCaseId1 1559403699899 false
4 sessionId1 useCaseId1 1559403699899 false
df1.endFlow.replace({'true': True, 'false': False}).groupby([df1.sessionId, df1.useCaseId.ne(df1.useCaseId.shift()).cumsum()]).sum().eq(False).sum()
Out[1264]: 2
注意:我从您的描述中了解到,只有一行的组也被视为连续行组。因此,如果其endFlow
为False