pandas - 将 UTM 函数应用于数据框列
pandas - apply UTM function to dataframe columns
我正在使用名为 UTM 的 this python 包,它将 WGS84 坐标转换为 UTM,反之亦然。我想将此功能应用于 pandas 数据框。该函数的工作原理如下:
utm.from_latlon(51.2, 7.5)
>>> (395201.3103811303, 5673135.241182375, 32, 'U')
其中输入是一对坐标,returnsUTM 系统中相同坐标的元组。出于我的目的,我只对元组的前两个元素感兴趣。
我正在开发一个名为 cities
的数据框,例如:
City;Latitude;Longitude;minx;maxx;miny;maxy
Roma;41.892916;12.48252;11.27447419;13.69056581;40.99359439;42.79223761
Paris;48.856614;2.352222;0.985506011;3.718937989;47.95729239;49.75593561
Barcelona;41.385064;2.173403;0.974836927;3.371969073;40.48574239;42.28438561
Berlin;52.519171;13.406091;11.92835553;14.88382647;51.61984939;53.41849261
Moscow;55.755826;37.6173;36.01941671;39.21518329;54.85650439;56.65514761
我想为每一行添加四列,称为 'utmminx'、'utmmax'、'utmminy'、'utmmaxy' 作为将 utm 函数应用于'minx'、'maxx'、'miny'、'maxy' 列。到目前为止,我尝试了以下操作,将结果元组的第一个和第二个值分配给新列:
cities['utmminx'],cities['utmmaxx'] = utm.from_latlon(cities['minx'],cities['maxx'])[0],utm.from_latlon(cities['minx'],cities['maxx'])[1]
但我收到了一个 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我尝试只为该函数设置第一行值并且它起作用了:
utm.from_latlon(cities['minx'][0],cities['maxx'][0])[0],utm.from_latlon(cities['minx'][0],cities['maxx'][0])[1]
>>> (357074.7837193568, 1246647.7959235134)
我想避免数据帧上的经典循环,因为我认为有一个经典的 pandas 方法可以做到这一点。
从你的相框开始
City Latitude Longitude minx maxx miny maxy
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594 42.792238
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292 49.755936
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742 42.284386
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849 53.418493
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504 56.655148
我们定义了一个函数,它接受一行,调用 utm.from_latlon() 和 returns 我们从 utm 获得的元组的前两个元素的系列。然后我们使用 Pandas' apply() 来调用该函数。我只做了一组坐标,但你可以为其他人做同样的 apply() 语句。
编辑 我将函数更改为按位置索引而不是名称以使函数可重用
def getUTMs(row):
tup = utm.from_latlon(row.ix[0],row.ix[1])
return pd.Series(tup[:2])
cities[['utmminy','utmminx']] = cities[['miny','maxx']].apply(getUTMs , axis=1)
cities
City Latitude Longitude minx maxx miny \
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504
maxy utmminy utmminx
0 42.792238 389862.562124 4538871.624816
1 49.755936 553673.645924 5311803.556837
2 42.284386 531525.080929 4481738.581782
3 53.418493 491957.246518 5718764.545758
4 56.655148 513814.029424 6078844.774914
您可以对
这样的列使用 apply
方法
使用 lambda 函数
In [120]: lambdafunc = lambda x: pd.Series(utm.from_latlon(x['minx'], x['maxx'])[:2])
并且,逐行应用
In [121]: cities[['utmminx', 'utmmax']] = cities.apply(lambdfunc), axis=1)
In [122]: cities
Out[122]:
City Latitude Longitude minx maxx miny maxy utmminx utmmax
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594 42.792238 357074.783719 1246647.795924
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292 49.755936 579990.155575 108936.764630
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742 42.284386 541385.186664 107751.160445
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849 53.418493 487350.117333 1318634.001517
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504 56.655148 519389.217259 3986123.464910
我正在使用名为 UTM 的 this python 包,它将 WGS84 坐标转换为 UTM,反之亦然。我想将此功能应用于 pandas 数据框。该函数的工作原理如下:
utm.from_latlon(51.2, 7.5)
>>> (395201.3103811303, 5673135.241182375, 32, 'U')
其中输入是一对坐标,returnsUTM 系统中相同坐标的元组。出于我的目的,我只对元组的前两个元素感兴趣。
我正在开发一个名为 cities
的数据框,例如:
City;Latitude;Longitude;minx;maxx;miny;maxy
Roma;41.892916;12.48252;11.27447419;13.69056581;40.99359439;42.79223761
Paris;48.856614;2.352222;0.985506011;3.718937989;47.95729239;49.75593561
Barcelona;41.385064;2.173403;0.974836927;3.371969073;40.48574239;42.28438561
Berlin;52.519171;13.406091;11.92835553;14.88382647;51.61984939;53.41849261
Moscow;55.755826;37.6173;36.01941671;39.21518329;54.85650439;56.65514761
我想为每一行添加四列,称为 'utmminx'、'utmmax'、'utmminy'、'utmmaxy' 作为将 utm 函数应用于'minx'、'maxx'、'miny'、'maxy' 列。到目前为止,我尝试了以下操作,将结果元组的第一个和第二个值分配给新列:
cities['utmminx'],cities['utmmaxx'] = utm.from_latlon(cities['minx'],cities['maxx'])[0],utm.from_latlon(cities['minx'],cities['maxx'])[1]
但我收到了一个 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我尝试只为该函数设置第一行值并且它起作用了:
utm.from_latlon(cities['minx'][0],cities['maxx'][0])[0],utm.from_latlon(cities['minx'][0],cities['maxx'][0])[1]
>>> (357074.7837193568, 1246647.7959235134)
我想避免数据帧上的经典循环,因为我认为有一个经典的 pandas 方法可以做到这一点。
从你的相框开始
City Latitude Longitude minx maxx miny maxy
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594 42.792238
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292 49.755936
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742 42.284386
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849 53.418493
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504 56.655148
我们定义了一个函数,它接受一行,调用 utm.from_latlon() 和 returns 我们从 utm 获得的元组的前两个元素的系列。然后我们使用 Pandas' apply() 来调用该函数。我只做了一组坐标,但你可以为其他人做同样的 apply() 语句。
编辑 我将函数更改为按位置索引而不是名称以使函数可重用
def getUTMs(row):
tup = utm.from_latlon(row.ix[0],row.ix[1])
return pd.Series(tup[:2])
cities[['utmminy','utmminx']] = cities[['miny','maxx']].apply(getUTMs , axis=1)
cities
City Latitude Longitude minx maxx miny \
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504
maxy utmminy utmminx
0 42.792238 389862.562124 4538871.624816
1 49.755936 553673.645924 5311803.556837
2 42.284386 531525.080929 4481738.581782
3 53.418493 491957.246518 5718764.545758
4 56.655148 513814.029424 6078844.774914
您可以对
这样的列使用apply
方法
使用 lambda 函数
In [120]: lambdafunc = lambda x: pd.Series(utm.from_latlon(x['minx'], x['maxx'])[:2])
并且,逐行应用
In [121]: cities[['utmminx', 'utmmax']] = cities.apply(lambdfunc), axis=1)
In [122]: cities
Out[122]:
City Latitude Longitude minx maxx miny maxy utmminx utmmax
0 Roma 41.892916 12.482520 11.274474 13.690566 40.993594 42.792238 357074.783719 1246647.795924
1 Paris 48.856614 2.352222 0.985506 3.718938 47.957292 49.755936 579990.155575 108936.764630
2 Barcelona 41.385064 2.173403 0.974837 3.371969 40.485742 42.284386 541385.186664 107751.160445
3 Berlin 52.519171 13.406091 11.928356 14.883826 51.619849 53.418493 487350.117333 1318634.001517
4 Moscow 55.755826 37.617300 36.019417 39.215183 54.856504 56.655148 519389.217259 3986123.464910