Pandas按列分组并计算唯一值的数量

3

我在使用Pandas查询时遇到了一些困难,希望能得到帮助。我正在使用的DataFrame如下:

data = {
    "id": ["A", "A", "A", "A", "A", "A", "B", "B"],
    "start": ["P1", "P2", "P3", "P4", "P1", "P5", "P1", "P3"],
    "finish": ["P2", "P3", "P4", "P1", "P5", "P1", "P3", "P5"],
    "order": [1, 2, 3, 4, 5, 6, 1, 2]
}
df = pd.DataFrame(data)
print(df)

  id start finish  order
0  A    P1     P2      1
1  A    P2     P3      2
2  A    P3     P4      3
3  A    P4     P1      4
4  A    P1     P5      5
5  A    P5     P1      6
6  B    P1     P3      1
7  B    P3     P5      2

对于每个id,我想计算出在“finish”列中达到的 唯一 点总数,但排除从P1开始的路径。

如果我们仔细看id A,期望的结果应该是3:

Step1: P1 -> P2 [X] (starting in P1 is forbidden) 
Step2: P2 -> P3 +1  
Step3: P3 -> P4 +1  
Step4: P4 -> P1 +1  
Step5: P1 -> P5 [X] (starting in P1 is forbidden)
Step6: P5 -> P1 +0  (P1 already visited in step 4)

使用相同的逻辑对于id为B,期望的结果应该是1。因此,我所需要的DataFrame如下:

  id result
0  A      3 
1  B      1    

我的思路如下:首先我创建了一个掩码来过滤所有起点为P1的记录。然后,我需要按ID对剩余记录进行分组,并计算完成列中唯一值的数量。我的问题是我不知道如何用Python/Pandas语言将刚才所述的内容转录出来。如果有帮助会感激不尽。


如果不允许从P1开始,并且在第6步中执行了“P5-> P1”,则为什么B的计数为1?它不应该是0吗? - Umar.H
1个回答

5
我们可以删除所有起点为 P1 的行,然后按 id 分组并计算独特的终点数:

(df[df['start'].ne('P1')]       # drop rows with `start` == 'P1'
   .groupby('id')               # group by `id`
   ['finish'].nunique()         # count unique `finish`
   .reset_index(name='result')  # match the output
)

输出:

  id  result
0  A       3
1  B       1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接