#python #pandas #numpy
#python #pandas #numpy
Вопрос:
У меня есть массив numpy, который содержит координаты (X, Y, Z) из 5 точек:
Coordinates = np.array([[1000, 1000,10],[1003, 1003,10],[1004, 1004,10],[1002, 1002,10],[1001, 1001,10]])
С другой стороны, у меня есть фрейм данных Pandas, который содержит значение переменной для каждой из этих 5 точек:
d = {"Values": [0.25, 0.24,0.23,0.3,0.22]}
df = pd.DataFrame(data=d)
С помощью treeBall_Neighbors я получаю индекс соседей каждой точки в радиусе 2 м:
treeBall_Neighbors = sklearn.neighbors.BallTree(Coordinates, leaf_size=2)
indices_Neighbors=treeBall_Neighbors.query_radius(Coordinates[:], r=2)
И, наконец, я хочу добавить среднее значение соседей каждой точки в dataframe:
df["Neighbors_Values"]=df["Values"].iloc[indices_Neighbors.tolist()[:]].mean()
Но, к сожалению, я получаю сообщение об ошибке «Ошибка значения: установка элемента массива с последовательностью». Единственное частичное решение, которое я получил, было только для первой строки:
df["Neighbors_Values"]=df["Values"].iloc[indices_Neighbors.tolist()[0]].mean()
Есть ли у вас какие-либо идеи о том, как я могу получить другие значения без выполнения цикла? Конечный результат должен выглядеть следующим образом:
Values Neighbors_Values
0 0.25 0.235
1 0.24 0.256667
2 0.23 0.235
3 0.30 0.253333
4 0.22 0.256667
Ответ №1:
Наконец, я решил проблему с помощью следующего кода (используя функцию и лямбда):
def Obtain_Mean(x, df):
print(df.Values.iloc[x.indices_Neighbors].mean())
return df.Values.iloc[x.indices_Neighbors].mean()
#inFile["Neighbors_Z"][i]=inFile["NDVI"].iloc[indices_Neighbors.tolist()[i]].mean()
Coordinates = np.array([[1000, 1000,10],[1003, 1003,10],[1004, 1004,10],[1002, 1002,10],[1001, 1001,10]])
d = {"Values": [0.25, 0.24,0.23,0.3,0.22]}
df = pd.DataFrame(data=d)
treeBall_Neighbors = sklearn.neighbors.BallTree(Coordinates, leaf_size=2)
indices_Neighbors=treeBall_Neighbors.query_radius(Coordinates[:], r=2)
df["indices_Neighbors"]=indices_Neighbors
df['Mean_Neighbors'] = df.apply(lambda x: Obtain_Mean(x, df) , axis=1)