【问题标题】: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,而是将其映射到您需要的列列表

标签: python pandas apply geojson shapely


【解决方案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 之类的名称,并且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多