#python #python-3.x #numpy
#python #python-3.x #numpy
Вопрос:
Я не уверен, как лучше всего это сделать, но у меня есть файл данных со списком координат x, y и некоторой величины. Допустим, население.
X, Y, POP
1.2, 1.3, 1000
22.5, 2.5, 250
...
98.6, 1.7, 1500
Итак, сначала я округляю X и Y до ближайшего int и создаю сеточную сетку на основе диапазона минимальных и максимальных значений.
Xmin = np.amin(df['X'])
Xmax = np.amax(df['X'])
Ymin = np.amin(df['Y'])
Ymax = np.amax(df['Y'])
## I use a step of 10 as I don't have enough memory for a step counter of 1
## This is where the problem is
X = np.arange(int(Xmin), int(Xmax), 10)
Y = np.arange(int(Ymin), int(Ymax), 10)
xx, yy = np.meshgrid(X, Y)
Итак, теперь у меня есть сетка, которая содержит все мои координаты. Проблема теперь заключается в том, что я хочу, чтобы эта новая сетка сетки содержала мои значения величины из фрейма данных.
Таким образом, я хочу сопоставить свой df с сеткой meshgrid, чтобы получить что-то вроде этого.
X, Y, POP
1, 1, 1000
10, 1, N/A
20, 1, 250
...
90, 1, 1500
Это то, что я использовал для решения своей проблемы, но это медленно и сравнивает каждое значение. Я полагаю, мой вопрос сводится к тому, есть ли более быстрый / эффективный метод по сравнению с моим кодом ниже? В конечном счете, я планирую заполнить значения N / A, используя среднее значение окружающих ячеек. Но для этого я хочу сначала отобразить все в красивую однородную сетку.
state = np.empty([X.shape[0], Y.shape[0]])
state[:] = np.nan
for i in range(0, len(X), 1):
for j in range(0, len(Y), 1):
for z in range(0, len(df['X']), 1):
if (abs(X[i] - df['X'][z]) < 10) and (abs(Y[j] - df['Y'][z]) < 10):
state[i,j] = df['POP'][z]
Комментарии:
1. Вам следует рассмотреть возможность объединения pandas для двух массивов.
Ответ №1:
precision = -1 # the number of digits to round off
df.groupby(
[df['X'].round(precision), df['Y'].round(precision)]
).POP.sum().unstack().reindex(np.arange(...), np.arange(...))
Я суммировал значения, попадающие в одну и ту же ячейку, возможно, вы захотите использовать среднее значение.