【发布时间】:2015-03-15 14:16:44
【问题描述】:
我正在尝试构建一个GeoJSON object。我的输入是一个包含地址列、纬度列和经度列的 csv。然后我从坐标中创建了 Shapely 点,按给定的半径将它们缓冲出来,并通过映射选项获取坐标字典 - 到目前为止,一切都很好。然后在参考this question之后,写了如下函数来获取一个Series字典:
def make_geojson(row):
return {'geometry':row['geom'], 'properties':{'address':row['address']}}
我就这样应用了它:
data['new_output'] = data.apply(make_geojson, axis=1)
我的结果列充满了这些:<built-in method values of dict object at 0x10...
最奇怪的部分是,当我直接调用函数时(即make_geojson(data.loc[0]),实际上我确实得到了我期待的字典。也许更奇怪的是,当我调用从应用程序中获取的函数时(例如data.output[0](),data.loc[0]['output']())我得到了以下列表的等价物:
[data.loc[0]['geom'], {'address':data.loc[0]['address']}],即我要获取的字典的值(但不是键)。
对于那些在家玩的人,这里有一个玩具示例:
from shapely.geometry import Point, mapping
import pandas as pd
def make_geojson(row):
return {'geometry':row['geom'], 'properties':{'address':row['address']}}
data = pd.DataFrame([{'address':'BS', 'lat':34.017, 'lon':-117.959}, {'address':'BS2', 'lat':33.989, 'lon':-118.291}])
data['point'] = map(Point, zip(data['lon'], data['lat']))
data['buffer'] = data['point'].apply(lambda x: x.buffer(.1))
data['geom'] = data.buffer.apply(mapping)
data['output'] = data.apply(make_geojson, axis=1)
【问题讨论】:
-
你能提供一个独立的例子来说明这个问题吗?
-
与往常一样,当您开始将非标量元素放入 Series 和 DataFrames 时,事情很可能会出轨;发生这种情况是因为假设 pandas 可以调用
someobj.values并获取 NDFrame 的值,但由于您已经给它一个字典,它会获取字典方法。你的最终目标是什么? -
我只是想获取一个 geojson 对象(或我可以转储到 geojson 的 python 字典)。这看起来像this。
-
@dsm 我正在关注示例here,但我的
f()等价物返回dict。与此问题相同的问题。然而,可以将dict存储在DataFrame中。我不太清楚你所说的“一个分支被占用”是什么意思——这是否意味着:apply与返回的dict根本不可能?在将dict结果存储在新列中时,是否有另一种方法可以对每一行进行操作? -
@bahmait 问题是字典上的 values 方法正在覆盖 NDFrame 上的 values 方法。不要将您调用的任何函数应用于 DataFrame,而是将其映射到您需要的列列表
标签: python pandas apply geojson shapely