Pandas 适用于 dateframe 产生 '<built-in method values of ...' [英] Pandas apply to dateframe produces '<built-in method values of ...'

查看:29
本文介绍了Pandas 适用于 dateframe 产生 '<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 产生 '&lt;built-in method values of ...'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆