我有这样的地理坐标数据帧大熊猫df
:
lat lon
0 48.01025772 -6.15690851
1 48.02164841 -6.10588741
2 48.03302765 -6.05480051
... ... ...
我需要将这些坐标转换为不同的系统,并对此有一个专门的功能。我打算创建两个新列,df['N']
这与lat
配对,以及与df['E']
配对lon
。
这是不相关的函数看起来像什么,所以为了简单起见,我们称之为F。功能操作是这样的:E, N = f(float(lat), float(lon))
有没有一种方法,我可以通过df
的所有行迭代,提取lat,lon
对,(计算它们的转化),并指定值相关的列?
您可以在DF使用apply
并通过axis=1
,在你的函数,你应该返回Series
并直接分配2列:
In [207]:
def foo(lat, lon):
return pd.Series([lat + 10, lon * 100])
df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1)
df
Out[207]:
lat lon new_lat new_lon
0 48.010258 -6.156909 58.010258 -615.6909
1 48.021648 -6.105887 58.021648 -610.5887
2 48.033028 -6.054801 58.033028 -605.4801
根据可以而且应该避免你的功能是通过做apply
您可以使用:
df[['lat', 'lon']].apply(lambda row: f(float(row['lat']), float(row['lon']), axis=1)
您可避免产生pd.Series,因为它需要大量的时间,并通过result_type='expand'
说法代替。这明显快运行在大Dataframes
def foo(lat, lon):
return [lat + 10, lon * 100]
df[['new_lat','new_lon']] = df.apply(lambda x: foo(x['lat'], x['lon']), axis=1, result_type='expand')
在我的数据框下面的时间达到了:纯申请(不分配,返回列表) - 27秒,与result_type='expand'
- 30秒,以回报pd.Series(...) - 41秒。