Python-遍历熊猫Groupby对象

时间:2019-06-02 03:39:28

标签: python pandas dataframe

这是我的数据框中包含的示例行:

{
"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')

我该如何实现?
更新:

  1. 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  
    
  2. 我尝试过的事情:
    我曾尝试通过'sessionId'和'usecaseId'对数据帧进行分组,但这无法正常工作,因为它将以'usecaseId'唯一地对数据帧进行分组,这不是我想要的,我想在通过'分组'之后遍历连续的行sessionId与“ usecaseId”相同,然后将具有相同“ useCaseId”且“ endFlow”仅作为“ false”的连续行计数。

  3. 预期输出: 按'sessionId'分组后,我想将具有'endFlow'的相同'useCaseId'的连续行的数量计为'false'
    从上面给出的分组示例中,预期结果如下: 1(因此,具有相同useCaseId'usecaseId1'的Row1-Row2的尾流只有'false',而'Row3'和'Row4-Row5'的尾流只有'true')

1 个答案:

答案 0 :(得分:2)

您可以尝试这样做:(我假设df.endFlow包含字符串'true''false'。如果包含布尔值TrueFalse,您只需执行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

注意:我从您的描述中了解到,只有一行的组也被视为连续行组。因此,如果其endFlowFalse

,则该计数将包括在内