熊猫groupby并计算列的唯一值

时间:2020-11-04 20:58:45

标签: python pandas pandas-groupby

我在使用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语言解释过的内容。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

我们可以使用start=='P1'删除所有行,然后按id分组并计算唯一的finish

(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