更新:
在我的数据集中,我有3列(x,y)和VALUE。 它看起来像这样(已经排序):
df1:
x , y ,value
1 , 1 , 12
2 , 2 , 12
4 , 3 , 12
1 , 1 , 11
2 , 2 , 11
4 , 3 , 11
1 , 1 , 33
2 , 2 , 33
4 , 3 , 33
我需要得到这些行,它们之间的距离(在 X 和 Y 列中)是 <= 1 ,假设它是我的半径。但与此同时,我只需要对那些价值相等的那些进行分组和过滤。 我在一个数据集中比较它时遇到了问题,因为有一个标头,所以我使用 python 命令创建了第二个数据集:
df:
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
我尝试使用此代码:
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']]
和
filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)]
for i in filtered_df.groupby('value'):
print(i)
在我收到与错误数据框相关的错误之前,我已经修复了它,但输出仍然没有结果。 这就是我从 df1 创建新数据框 df 的方式,如果您有更好的想法,请把它放在这里,是一个大减号,因为总是给我打印表格。我再次测试它,这个def给了我空的数据帧。
VALUE1= df1.VALUE.unique()
def separator():
lst=[]
for VALUE in VALUE1:
abc= df1[df1.VALUE==VALUE]
print abc
return lst
ab=separator()
df=pd.DataFrame(ab)
当我尝试普通数据集 df1 时,我在不考虑半径 =1 的情况下输出所有数据
我需要像这样进入我的输出表:
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
更新 2:
我现在正在使用以下代码:
filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)]
for i in filtered_df.groupby('value'):
print(i)
似乎还可以(我以 df1 作为输入),但是当我查看输出时, 它什么也没做,因为他不知道应该从什么值使用半径 +/-1,这就是我认为的原因。 在我的数据集中,我有更多的列,所以让我们考虑我的第 4 列和第 5 列"D'&'E",因此半径将从该行中获取,其中 D 和 E 列中的最小值同时存在。
df1:
x , y ,value ,D ,E
1 , 1 , 12 , 1 , 2
2 , 2 , 12 , 2 , 3
4 , 3 , 12 , 3 , 4
1 , 1 , 11 , 2 , 1
2 , 2 , 11 , 3 , 2
4 , 3 , 11 , 5 , 3
1 , 1 , 33 , 1 , 3
2 , 2 , 33 , 2 , 3
4 , 3 , 33 , 3 , 3
所以输出结果应该和我想要的一样,但现在我知道在这种情况下应该从什么值半径 +/-1 开始。 现在有人可以帮助我吗? 对不起,误会了!
据我了解,您进行操作的顺序(过滤距离为 <= 1 的操作并对其进行分组)并不重要。
这是我的看法:
#first selection of the lines with right distance
filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)]
# Then group
for i in filtered_df.groupby('value'):
print(i)
# Or do whatever you want
如果您想对代码的某些部分如何工作进行一些解释,请告诉我。