【问题标题】:pandas - apply UTM function to dataframe columnspandas - 将 UTM 函数应用于数据框列
【发布时间】:2015-05-03 14:01:18
【问题描述】:

我正在使用名为 UTM 的 this python 包,它将 WGS84 坐标转换为 UTM,反之亦然。我想将此功能应用于熊猫数据框。该函数的工作原理如下:

utm.from_latlon(51.2, 7.5)
>>> (395201.3103811303, 5673135.241182375, 32, 'U')

其中输入是几个坐标,它返回 UTM 系统中相同坐标的元组。出于我的目的,我只对元组的前两个元素感兴趣。

我正在开发一个名为 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

由于将 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 方法可以做到这一点。

【问题讨论】:

    标签: python pandas utm


    【解决方案1】:

    您可以在列上使用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
    

    【讨论】:

    • 哇,我们真的很亲密!我喜欢 lambda。
    • 你秒杀我 =) 实际上,它可以是像 cities.apply(lambda x: pd.Series(utm.from_latlon(x['minx'], x['maxx'])[:2])), axis=1) 这样的单行代码,但由于长度和可读性,必须拆分 lambda 函数!
    【解决方案2】:

    从你的框架开始

            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() 并返回我们从 utm 获得的元组的前两个元素的 Series。然后我们使用 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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2021-02-03
      • 2019-05-01
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多