【问题标题】:Is there a way to add a column to a geopandas dataframe using a single value geoseries?有没有办法使用单值地理序列向 geopandas 数据框添加列?
【发布时间】:2019-06-01 17:45:29
【问题描述】:

我正在尝试将一列添加到 Geopandas (0.4.0) 中的地理数据框中,其中包含来自 geoseries 的单个值(点)以用于进一步计算。

但是,在简单地创建一个新列并直接分配 geoseries 之后,我注意到新列填充了 NaN。

如果我使用 shapely 对象本身,我会收到以下错误消息: '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)

【问题讨论】:

  • gdf = gdf.assign(new_column=new_value)
  • 您好,求帮助。在 new_column 中仍然只有 nan。我试图分配的值是一个匀称的点
  • 你能提供一些可重现的代码示例吗?我们看不到的东西很难调试。
  • 添加代码,抱歉

标签: python-3.x geopandas


【解决方案1】:

(geo)pandas 的神奇之处在于它会自动对齐索引上的数据。因此,它将您的单值系列与数据框的索引对齐。最多只能有一场比赛。如果您想为新列分配一个常量值,请使用标量。

举个例子(而不是我提供的可重现的例子):

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

【讨论】:

  • txs 很多,很有意义。就我而言,我的标量是一个匀称的对象点。当尝试执行您建议的操作时,我收到了我之前提到的断言错误。
  • @FabioL。你说你用的是一个系列,那是哪个?标量还是序列?
  • 它是来自地理数据框几何列的地理序列,仅包含一个值 (POINT)。
  • @FabioL。所以它不是一个标量,它是一个系列。由于它是一个系列,pandas 将尝试根据索引将该系列与您的数据框对齐。要从 N = 1 系列中获取标量,请使用:scalar = geoser.iloc[0]
  • 嗨,保罗,我明白这一点。但是,在尝试按照您的建议从系列中提取值并分配给地理数据框中的新列时,我仍然收到此断言错误。
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多