首页 > 解决方案 > 根据 Pandas df 另一列中的最大值删除重复行

问题描述

我有一个如下所示的熊猫 df

在下面的 df 中,在索引中0,1 & 2,3......& 500,501,502在 X 和 Y 列中找到的重复值,第二轮再次以索引中 X 和 Y 列中的相同重复值开始,1000, 1001 & 1002,1003 & ....1200,1201.... it goes on但在权重列中具有不同的权重。

index     x         y         weight
0         59.644    10.72     0.69
1         59.644    10.72     0.82
2         57.822    10.13     0.75
3         57.822    10.13     0.68
4         57.822    10.13     0.20
.
.
500       53.252    10.85     0.15
501       53.252    10.85     0.95
502       53.252    10.85     0.69
.
.
1000      59.644    10.72     0.85
1001      59.644    10.72     0.73
1002      57.822    10.13     0.92
1003      57.822    10.13     0.15
.
.
.
1200       53.252    10.85     0.78
1201       53.252    10.85     1.098        

我的要求

我想要我的 df
1) 避免在 X 和 Y 中重复/重复的行值,其权重值小于 0.60

2)但仍然在 X 和 Y 列重复中重复,所以现在我想比较重复行之间的权重值并删除权重较小的行。

3)如果我使用下面的代码,它会删除 x & y 之间的所有重复项

df_2.groupby(['X', 'Y'], as_index=False,sort=False)['weight'].max()

但是我想比较第一个出现的重复项并删除它们,然后是第二个,然后是第三个,依此类推..以便在某些行之后重复值的连续性占优势。为了更好地理解,请参考以下所需的df

df 应该是什么样子:

index     x         y         weight
1         59.644    10.72     0.82
2         57.822    10.13     0.75
.
.
501      53.252    10.85      0.95
.
.
1000      59.644    10.72     0.85
.
1002      57.822    10.13     0.92
.
.
1201       53.252    10.85     1.098   
.
.

我曾尝试使用 if 语句,但代码行增加了。我相信应该有一种替代的pythonic方式让它更容易。(内置函数或使用 numpy)任何帮助将不胜感激。

标签: pythonpython-3.xpandaspython-2.7numpy

解决方案


就像评论中提到的@Erfan 一样,这里有必要按助手分组Series以区分连续的组:

x1 = df['x'].ne(df['x'].shift()).cumsum()
y1 = df['y'].ne(df['y'].shift()).cumsum()

df = df[df.groupby([x1, y1])['weight'].transform('max') == df['weight']]
print (df)
    index       x      y  weight
1       1  59.644  10.72   0.820
2       2  57.822  10.13   0.750
6     501  53.252  10.85   0.950
8    1000  59.644  10.72   0.850
10   1002  57.822  10.13   0.920
13   1201  53.252  10.85   1.098

推荐阅读