Pandas применяется к дате кадра, вырабатывает '<встроенные значения метода...'

Я пытаюсь создать объект GeoJSON. Мой вход - csv с столбцом адреса, столбцом lat и столбцом lon. Затем я создал точки Shapely из координат, буферизую их на заданный радиус и получаю словарь координат через опцию сопоставления - пока что так хорошо. Затем, обратившись к этому вопросу, я написал следующую функцию, чтобы получить серию словарей:

  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]), я действительно получаю словарь, который я ожидаю. Возможно, даже страннее, когда я вызываю функции, которые я получаю от apply ( например 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)

Ответ 1

Спасибо, DSM, за это. Извлеченный урок: 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.

Причина, по которой я получал ошибку (built-in method of Row object, в моем случае), была потому, что мое имя поля count сталкивалось с наследованным количеством методов из кортежей python (как видно здесь).

Решение просто изменило имя поля на нечто вроде my_count, и оно отлично работало.