使用Lambda时能否为DataFrame的pipe方法传递参数?
在pandas pipe中使用内联Lambda实现DataFrame转换
我在对DataFrame执行一系列转换操作时,希望直接在pipe方法中用内联Lambda函数完成转换,不用单独定义函数,但尝试的代码报错了。
错误的Lambda写法
import pandas as pd import geopandas as gpd data = { "calories": [420, 380, 390], "duration": [50, 40, 45], "lon": [6.23, 6.24, 6.25], "lat": [-75.1, -75.2, -75.3] } df = pd.DataFrame(data) df_transformed = ( # 包含合并和空间连接等一系列转换操作 # 这些操作会修改原始的lon和lat列 .pipe(lambda x: gpd.GeoDataFrame, geometry=gpd.points_from_xy(x['lon'], x['lat']), crs='EPSG:4326') ) # 报错:x is not defined
错误原因
这段代码的问题在于Lambda的写法不符合pipe的调用逻辑:
pipe会把当前DataFrame作为第一个参数传给Lambda,但代码直接返回了gpd.GeoDataFrame类,没有将传入的x作为参数传入构造函数;gpd.points_from_xy(x['lon'], x['lat'])中的x不在Lambda的参数作用域内,导致变量未定义。
修正后的内联Lambda写法
正确的Lambda需要接收DataFrame作为参数,在函数内部完整调用gpd.GeoDataFrame并传入所有必要参数:
import pandas as pd import geopandas as gpd data = { "calories": [420, 380, 390], "duration": [50, 40, 45], "lon": [6.23, 6.24, 6.25], "lat": [-75.1, -75.2, -75.3] } df = pd.DataFrame(data) df_transformed = ( df # 这里可以串联其他pipe转换操作 .pipe(lambda x: gpd.GeoDataFrame( x, geometry=gpd.points_from_xy(x['lon'], x['lat']), crs='EPSG:4326' )) )
如果需要传递额外参数(比如自定义经纬度列名),可以在Lambda中添加参数,并在pipe里传入对应值:
df_transformed = ( df .pipe(lambda x, lon_col, lat_col: gpd.GeoDataFrame( x, geometry=gpd.points_from_xy(x[lon_col], x[lat_col]), crs='EPSG:4326' ), lon_col='lon', lat_col='lat') )
已验证的自定义函数写法
如果转换逻辑复杂或需要复用,定义单独的函数依然是可靠方案:
import pandas as pd import geopandas as gpd def turn_to_geo(df: pd.DataFrame, lon: str, lat: str) -> gpd.GeoDataFrame: return gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df[lon], df[lat]), crs='EPSG:4326') data = { "calories": [420, 380, 390], "duration": [50, 40, 45], "lon": [6.23, 6.24, 6.25], "lat": [-75.1, -75.2, -75.3] } df = pd.DataFrame(data) df_transformed = ( df # 包含合并和空间连接等一系列转换操作 .pipe(turn_to_geo, 'lon', 'lat') )
内容的提问来源于stack exchange,提问作者Alejandro Henao
相关产品推荐
相关产品推荐

