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