更新: 我有一个表的坐标点(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]
但它仍然无效; / 谢谢你的帮助!
答案 0 :(得分:0)
我可能会误解,但我不认为你所写的内容符合你的预期输出。根据我的解释,似乎你想用<列x
和y
之间的绝对差异为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
你怎么看?
谢谢!