删除未更改地点的人的行

2024-09-26 17:57:48 发布

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

我试图一次遍历两行数据帧,检查两行中的列值是否相同,并删除这些行。我的数据帧跟踪不同的人在不同遭遇中的位置。你知道吗

我有一个名为transfers的数据帧,其中每一行由一个人的ID号、一个遭遇号和一个位置组成。transfers数据框是通过在我的原始数据框上运行一个duplicated来找到具有相同person ID的行,并将它们分组在一起而创建的。你知道吗

例如,我们想去掉下面数据框中带有ID = 2的行,因为在两次相遇中位置都是"D",所以这个人没有移动。你知道吗

但是,我们希望保留带有ID = 3的行,因为此人从"A"移动到了"F"。你知道吗

另一个问题是因为有些人有两行以上,例如whereID = 1。对于此人,我们希望保留它们的行,因为它们已从"A"->;"B"移动到"B"->;"C"。但是,如果你只比较第12次和第13次相遇,看起来这个人并没有改变位置。你知道吗

示例数据帧df

ID  Encounter  Location
1      11         A
1      12         B
1      13         B
1      14         C
2      21         D
2      22         D
3      31         A
3      32         F

预期产量:

ID  Encounter  Location
1      11         A
1      12         B
1      13         B
1      14         C
3      31         A
3      32         F

我曾经尝试过使用.iterrows()的嵌套for循环,但是我发现这不起作用,因为它的速度非常慢,并且不能正确处理一个人有两次以上遭遇的情况。我也尝试过对我的数据帧应用一个函数,但运行时几乎与原始循环相同。你知道吗

编辑:我应该明确指出这一点,我试图保持任何人谁移动了位置的数据,即使他们最终回到他们开始的地方。你知道吗


Tags: 数据gtid示例原始数据locationtransfersperson
1条回答
网友
1楼 · 发布于 2024-09-26 17:57:48

给予

>>> df                                                                                                                            
   ID  Encounter Location
0   1         11        A
1   1         12        B
2   1         13        B
3   1         14        C
4   2         21        D
5   2         22        D
6   3         31        A
7   3         32        F

您可以通过

>>> places = df.groupby('ID')['Location'].transform('nunique')                                                                 
>>> df[places > 1]                                                                                                             
   ID  Encounter Location
0   1         11        A
1   1         12        B
2   1         13        B
3   1         14        C
6   3         31        A
7   3         32        F

这样做的目的是计算每个组(ID)中唯一的位置的数量,然后将一个人只去过一个地方的行删除。你知道吗


filter解决方案的比较:

# setup
>>> df = pd.concat([df.assign(ID=df['ID'] + i) for i in range(1000)], ignore_index=True)                                          
>>> df                                                                                                                            
        ID  Encounter Location
0        1         11        A
1        1         12        B
2        1         13        B
3        1         14        C
4        2         21        D
...    ...        ...      ...
7995  1000         14        C
7996  1001         21        D
7997  1001         22        D
7998  1002         31        A
7999  1002         32        F

[8000 rows x 3 columns]
# timings @ i5-6200U CPU @ 2.30GHz
>>> %timeit df.groupby('ID').filter(lambda x: x['Location'].nunique() > 1)                                                        
356 ms ± 19.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit df[df.groupby('ID')['Location'].transform('nunique') > 1]                                                             
5.56 ms ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关问题 更多 >

    热门问题