删除两列之间的差异为>的行。 1

时间:2017-02-24 11:41:04

标签: python pandas

更新: 我有一个表的坐标点(x,y)和该点的值。 我有太多的分数,所以我需要删除其中的一些,并留下具有最​​高价值的特定区域。 我只是当一行中的x和y等于x和y到另一行时才删除。 让我们设置位置限制= 1,低于1我想过滤点。

INPUT:

x , y ,value
1 , 1 , 12
2 , 2 , 11
4 , 2 , 22
5 , 5 , 78
6 , 6 , 33

我希望输出= 1限制距离后,保留最高值:

结果我想收到:

x , y ,value
1 , 1 , 12
4 , 2 , 22
5 , 5 , 78

此代码

df2 = df.loc[abs(df['x'] - df['y']) > 1]
df2.loc[df2['value'] == df2['value'].max()]  

给我同样的结果:

df=df2.groupby(['x'])['value'].transform(max)== df2['value']
df3=df2[df]

但它仍然无效; / 谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

我可能会误解,但我不认为你所写的内容符合你的预期输出。根据我的解释,似乎你想用<列xy之间的绝对差异为1。如果这是正确的,请尝试

df.loc[abs(df['x'] - df['y']) > 1]

如果您认为它不能反映您想要实现的目标,请随意将我的编辑内容回滚到您的问题中。

根据评论更新

我仍然不确定我理解,但请尝试

df2 = df.loc[abs(df['x'] - df['y']) > 1]
df2.loc[df2['value'] == df2['value'].max()]

df2 = df.loc[abs(df['x'] - df['y']) <= 1]
df.loc[(abs(df['x'] - df['y']) > 1) | (df['value'] == df2['value'].max())]

答案 1 :(得分:0)

这不是最漂亮的,但根据你对这个问题的最新评论,我想这会得到你想要的。

def dist_value_comp(row):                         
    x_dist = abs(df['y'] - row['y']) <= 1
    y_dist = abs(df['x'] - row['x']) <= 1
    xy_dist = x_dist & y_dist
    max_value = df.loc[xy_dist, 'value'].max()
    return row['value'] == max_value

df['keep_row'] = df.apply(dist_value_comp, axis=1)
df.loc[df['keep_row'], ['x', 'y', 'value']]

它可以正确处理问题中的示例数据集。

答案 2 :(得分:0)

@cheflo,你好。代码工作正常,但现在我必须准备我的新数据集,现在看起来像这样:

x , y ,value
1 , 1 , 12
2 , 2 , 12
4 , 3 , 12
x , y ,value
1 , 1 , 11
2 , 2 , 11
4 , 3 , 11
x , y ,value
1 , 1 , 33
2 , 2 , 33
4 , 3 , 33

我创建了这样的数据集,按半径过滤仅等于'values',我现在需要将所有数据保留在我的半径中(在本例中为= 1) 在OUTPUT我需要:

x , y ,value
1 , 1 , 12
2 , 2 , 12
x , y ,value
1 , 1 , 11
2 , 2 , 11
x , y ,value
1 , 1 , 33
2 , 2 , 33

当然我也有正常的数据集,包含所有这些值,只有一个标题,但在这种形式中,我认为会更容易,但我收到了一个错误:

AttributeError: 'NoneType' object has no attribute 'apply'
line 93, in <module>
leave_it = df.apply(distance_between, axis=1)
从现在的最后一段代码

我只改变了

x_dist = abs(df['y'] + row['y']) <= 1 #- to +
y_dist = abs(df['x'] + row['x']) <= 1
你怎么看? 谢谢!