我正在尝试使用 python pandas 数据框中的
dask_geopandas
和 Nominatim
库获取印度尼西亚地区的经度和纬度。但是,它总是返回错误。我得到的最新错误:
__init__() got an unexpected keyword argument 'geometry'
这是我最近使用的代码:
import dask.dataframe as dd
import dask_geopandas as dask_gpd
import pandas as pd
from geopy.geocoders import Nominatim
import numpy as np
ddf = dd.from_pandas(df_cleaned, npartitions=4)
geolocator = Nominatim(user_agent="my_geocoder")
def geocode_area(area):
try:
location = geolocator.geocode(area)
return (location.latitude, location.longitude)
except:
return (np.nan, np.nan)
ddf['latitude'] = np.nan
ddf['longitude'] = np.nan
ddf['latitude'], ddf['longitude'] = ddf['kodya / kab'].apply(lambda x: pd.Series(geocode_area(x)))
dask_gdf = dask_gpd.GeoDataFrame(ddf, geometry=dask_gpd.points_from_xy(ddf.longitude, ddf.latitude), crs='EPSG:4326')
ddf = dask_gdf.drop(columns=['geometry']).compute()
ddf.to_csv('processed_data.csv', index=False)
这种情况下可能的正确代码是什么?我只想得到一个基于
kodya / kab
的经度和纬度的熊猫数据框。数据框由 17000++ 行组成。提前谢谢你。
您可以尝试使用 from_dask_dataframe 代替:
dask_gdf = dask_gpd.from_dask_dataframe(ddf, geometry=dask_gpd.points_from_xy(ddf.longitude, ddf.latitude))
错误消息表明 geometry 关键字参数不是 GeoDataFrame 构造函数的有效参数。这可能是因为 dask_geopandas 使用与 GeoDataFrame 的 geopandas 不同的构造函数。
您可以将几何列添加到 ddf DataFrame,然后使用 dask_geopandas.from_dask_dataframe 函数将其转换为 GeoDataFrame,而不是将 geometry 关键字参数传递给 GeoDataFrame 构造函数。这是您应该可以使用的代码的更新版本:
import dask.dataframe as dd
import dask_geopandas as dask_gpd
import pandas as pd
from geopy.geocoders import Nominatim
import numpy as np
ddf = dd.from_pandas(df_cleaned, npartitions=4)
geolocator = Nominatim(user_agent="my_geocoder")
def geocode_area(area):
try:
location = geolocator.geocode(area)
return (location.latitude, location.longitude)
except:
return (np.nan, np.nan)
ddf['latitude'] = np.nan
ddf['longitude'] = np.nan
ddf[['latitude', 'longitude']] = ddf['kodya / kab'].apply(lambda x: pd.Series(geocode_area(x)))
ddf['geometry'] = dask_gpd.points_from_xy(ddf['longitude'], ddf['latitude'])
dask_gdf = dask_gpd.from_dask_dataframe(ddf, crs='EPSG:4326')
dask_gdf.to_csv('processed_data.csv', index=False)
在这个更新的代码中,我们首先使用 apply 方法将纬度和经度列添加到 ddf DataFrame。然后我们使用 dask_geopandas.points_from_xy 函数添加几何列。最后,我们使用 dask_geopandas.from_dask_dataframe 函数将 ddf DataFrame 转换为 dask_geopandas.GeoDataFrame。