Python: Как ~ используется для исключения данных? - PullRequest
0 голосов
/ 13 апреля 2020

В приведенном ниже коде я знаю, что он возвращает все записи, которые находятся за пределами буфера, но я запутался в механике того, как это происходит.

Я вижу, что используется "~" (иначе говоря, не по битам). Из некоторого поиска в Google я понимаю, что ~ он возвращает инверсию каждого бита на входе, который он передает, например, если бит равен 0, он возвращает 1. Верно ли это, если кто-то не может, пожалуйста, ELI5?

Может, кто-нибудь объяснит фактическую механику того, как приведенный ниже код возвращает записи, которые находятся за пределами буфера "my_union"?

ПРИМЕЧАНИЕ: больницы и столкновения - это просто гео-фреймы данных.

coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000) 
my_union = coverage.geometry.unary_union 
outside_range = collisions.loc[~collisions["geometry"].apply(lambda x: my_union.contains(x))]

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

~ действительно работает по битам не в python. Но здесь он используется для логического выполнения не для каждого элемента списка (или, скорее, pandas Series) логических значений. См. этот ответ для примера.

Предположим, что collisions GeoDataFrame содержит точки, но он будет работать аналогично для других типов геометрии. Позвольте мне немного изменить код:

coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000) 
my_union = coverage.geometry.unary_union
within_my_union = collisions["geometry"].apply(lambda x: my_union.contains(x))
outside_range = collisions.loc[~within_my_union]

Затем:

  1. my_union - это один (много) многоугольник.

  2. my_union.contains(x) возвращает логическое значение, указывающее, находится ли точка x в пределах my_union MultiPolygon.

  3. collisions["geometry"] - это серия pandas, содержащая точки .

  4. collisions["geometry"].apply(lambda x: my_union.contains(x)) будет работать my_union.contains(x) в каждой из этих точек. Это приведет к другой серии pandas, содержащей булевы значения, указывающие, находится ли каждая точка в пределах my_union.

  5. ~, затем отрицает эти логические значения, так что теперь ряд указывает, является ли каждая точка не в my_union.

  6. collisions.loc[~within_my_union], затем выбирает все строки collisions, где запись в ~within_my_union равна True, то есть все точки, которые не l ie в пределах my_union.

0 голосов
/ 13 апреля 2020

Я не совсем точно понимаю, что вы имеете в виду под реальной механикой, и трудно понять наверняка, не видя входных и выходных данных, но у меня было go при объяснении ниже, если это полезно:

Все строки из столбца geometry в коллизиях данных, содержащие любое значение в my_union , будут исключены из вновь созданного outside_range dataframe .

...