Pandas 适用于 dateframe 产生 '<built-in method values of ...' [英] Pandas apply to dateframe produces '<built-in method values of ...'
问题描述
我正在尝试构建一个 GeoJSON 对象.我的输入是一个带有地址列、纬度列和经度列的 csv.然后我从坐标中创建了 Shapely 点,按给定的半径缓冲它们,并通过映射选项获取坐标字典 - 到目前为止,很好.然后,在参考了这个问题后,我写道以下函数可获取一系列字典:
def make_geojson(row):返回 {'geometry':row['geom'], 'properties':{'address':row['address']}}
I'm trying to build a GeoJSON object. My input is a csv with an address column, a lat column, and a lon column. I then created Shapely points out of the coordinates , buffer them out by a given radius, and get the dictionary of coordinates via the mapping option- so far, so good. Then, after referring to this question, I wrote the following function to get a Series of dictionaries:
def make_geojson(row):
return {'geometry':row['geom'], 'properties':{'address':row['address']}}
我就是这样应用的:
data['new_output'] = data.apply(make_geojson, axis=1)
我的结果列充满了这些:<0x10 处 dict 对象的内置方法值...
My resulting column is full of these: <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']}]
,即我想得到的字典.
The weirdest part is, when I directly call the function (i.e. make_geojson(data.loc[0])
I do in fact get the dictionary I'm expecting. Perhaps even weirder is that, when I call the functions I'm getting from the apply (e.g. data.output[0]()
, data.loc[0]['output']()
) I get the equivalent of the following list:
[data.loc[0]['geom'], {'address':data.loc[0]['address']}]
, i.e. the values (but not the keys) of the dictionary I'm trying to get.
对于那些在家玩耍的人,这里有一个玩具示例:
For those of you playing along at home, here's a toy example:
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)
推荐答案
感谢 DSM 指出这一点.经验教训:pandas 不适用于任意 Python 对象
Thanks, DSM, for pointing that out. Lesson learned: pandas is not good for arbitrary Python objects
所以这就是我最终要做的:
So this is what I wound up doing:
temp = zip(list(data.geom), list(data.address))
output = map(lambda x: {'geometry': x[0], 'properties':{'address':x[1]}}, temp)
这篇关于Pandas 适用于 dateframe 产生 '<built-in method values of ...'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!