glp*_*psx 3 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
Run Code Online (Sandbox Code Playgroud)
对于每个 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)
Run Code Online (Sandbox Code Playgroud)
对 id B 使用相同的逻辑,预期结果应为 1。因此,我正在查看的结果 DataFrame 如下:
id result
0 A 3
1 B 1
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的想法:我首先创建了一个掩码来过滤掉起点为 P1 的所有记录。然后,我需要按 id 对剩余记录进行分组并计算完成列中的唯一值。我的问题是我不知道如何转录我刚刚用 Python/Pandas 语言解释的内容。任何帮助,将不胜感激。
我们可以删除所有行start=='P1',然后 groupbyid和 count unique 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
)
Run Code Online (Sandbox Code Playgroud)
输出:
id result
0 A 3
1 B 1
Run Code Online (Sandbox Code Playgroud)