«Ошибка значения: установка элемента массива с последовательностью» Присвоение среднего значения соседства точки в pandas

#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)