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
, и оно отлично работало.