熊猫适用于数据框产生'<内置方法值......'
Posted
技术标签:
【中文标题】熊猫适用于数据框产生\'<内置方法值......\'【英文标题】:Pandas apply to dateframe produces '<built-in method values of ...'熊猫适用于数据框产生'<内置方法值......' 【发布时间】: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,而是将其映射到您需要的列列表
【参考方案1】:
感谢帝斯曼指出这一点。经验教训:pandas 不适用于任意 Python 对象
所以这就是我最终要做的:
temp = zip(list(data.geom), list(data.address))
output = map(lambda x: 'geometry': x[0], 'properties':'address':x[1], temp)
【讨论】:
【参考方案2】:我之所以写这篇文章是因为我遇到了类似的问题,但是在运行 PySpark DataFrame 而不是 Pandas 时。
如果有人像我一样来到这里,我将解释我是如何为 PySpark DataFrame 修复它的。
我收到错误的原因(在我的例子中是built-in method of Row object
),是因为我的字段名称count
与从python 元组继承的方法计数发生冲突(如here 所示)。
解决方案只是将字段名称更改为 my_count
之类的名称,并且效果很好。
【讨论】:
以上是关于熊猫适用于数据框产生'<内置方法值......'的主要内容,如果未能解决你的问题,请参考以下文章