熊猫适用于数据框产生'<内置方法值......'

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)

我的结果列充满了这些:&lt;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 之类的名称,并且效果很好。

【讨论】:

以上是关于熊猫适用于数据框产生'<内置方法值......'的主要内容,如果未能解决你的问题,请参考以下文章

无法获取数据,使用包 yfinance 按格式分组下载到熊猫数据框中,仅适用于我的子列表中的特定代码

在多个熊猫数据帧上执行相同操作的正确方法是什么?

熊猫滚动适用于可变窗口长度

将方法列表中的方法应用于熊猫数据框

熊猫中的条件替换

通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?