Python循环遍历pandas Groupby对象

2024-05-29 03:02:35 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是数据框中的一个示例行:

{
"sessionId" : "454ec8b8-7f00-40b2-901c-724c5d9f5a91",
"useCaseId" : "3652b5d7-55b8-4bee-82b6-ab32d5543352",
"timestamp" : "1559403699899",
"endFlow" : "true"
}    

我按“sessionId”进行groupby,这会给我一个这样的组:

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'的连续行(因此,在上面的组中,将有三组连续行我想循环,
第1-2行、第3行、第4-5行

以及从上述连续的行集合(Row1-Row2、Row3、Row4-Row5(其中每个集合具有相同的useCaseId)
我想找出只有false中的行endflow值的集合数。你知道吗

因此,从上面给出的组的例子来看,预期结果如下:
1(因为具有相同useCaseId'usecaseId1'的行1-Row2只有endflow'false',而'Row3'和'Row4-Row5'有endflow'true')

我怎样才能做到这一点?
更新:

  1. 你知道吗测向头():

    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”分组后,在连续行中循环,然后计算只有“endFlow”的具有相同“usecaseId”的连续行“错误”。

  3. 预期产量: 按“sessionId”分组后,我想计算具有相同“useCaseId”且“endFlow”仅为“false”的连续行数
    从上述给定的组示例中,预期结果如下: 1(因为具有相同useCaseId'usecaseId1'的行1-Row2只有endflow'false',而'Row3'和'Row4-Row5'有endflow'true')


Tags: 数据falsetruetimestamprowrow2row3sessionid
1条回答
网友
1楼 · 发布于 2024-05-29 03:02:35

您可以这样做:(我假设df.endFlow包含'true''false'的字符串。如果它包含布尔值TrueFalse,只需取出replace命令(eem>)

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,则计数将包括它

相关问题 更多 >

    热门问题