Есть ли способ добавить столбец в фрейм данных геопанды, используя геосерии с одним значением? - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь добавить столбец к геоданным в Geopandas (0.4.0) с единичными значениями (точками) из геосерии, которые будут использоваться в дальнейших расчетах.

Однако, после простого создания нового столбца и непосредственного назначения геосерий, я заметил, что новый столбец заполнен NaN.

Если я использую сам фигурный объект, я получаю следующее сообщение об ошибке: 'AssertionError: форма новых значений должна быть совместима с формой менеджера'

пример ниже:

import pandas as pd
import numpy as np
import geopandas as gpd
from shapely.geometry import Point

# create some geometry
coordinates = {'lng': [1,2,3], 'lat': [4,5,6], 'loc': ['a', 'b', 'd']}
df = pd.DataFrame(coordinates, columns = ['loc', 'lat', 'lng'])


df['geometry'] = df.apply(
    lambda x: Point((x.lat, x.lng)), 
    axis = 1)

# create point of interest
coordinates_center = {'lng': 2.2, 'lat': 4.8, 'loc': ['c']}
df_center = pd.DataFrame(coordinates_center)

df_center['geometry'] = df.apply(
    lambda x: Point((x.lat, x.lng)), 
    axis = 1)

# check data type
print (type(df_center))
center = df_center['geometry']
print (type(center))
center_point = center[0]
print (type(center_point))

#create new column in main dataframe and assign the point of interest
df.assign(center=center_point)

1 Ответ

0 голосов
/ 03 июня 2019

Волшебный соус с (гео) пандами заключается в том, что он автоматически выравнивает данные по индексу. Так что это выравнивает ваш ряд значений по индексу фрейма данных. Максимум может быть только один матч. Если вы хотите присвоить постоянное значение новому столбцу, используйте скаляр.

Взять, к примеру (а не воспроизводимый пример, который я привел):

import pandas

df = pandas.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}, index=list('abc'))
s = pandas.Series([6], index=[0])

print(df.assign(C=s))

Получаем:

   A  B   C
a  0  3 NaN
b  1  4 NaN
c  2  5 NaN

Это связано с тем, что индекс s и индекс df не имеют совпадений. Если бы было одно совпадение (начиная с len(s) == 1), вы получите:

s = pandas.Series([6], index=['b'])

print(df.assign(C=s))
   A  B   C
a  0  3 NaN
b  1  4 6.0
c  2  5 NaN

Но это не то, что вы хотите, поэтому вы должны просто использовать скаляр:

print(df.assign(C=6))
   A  B  C
a  0  3  6
b  1  4  6
c  2  5  6
...