从pandas apply构造一个数据帧

2024-06-09 19:51:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,返回纬度和经度信息。我想在数据框中为这4个变量创建列。在

这是我的代码:

import geocoder
import pandas as pd
import geolib
from geolib import geohash

df = pd.read_csv('New_DP2.csv')

key = [redacted]


fields = ['NWLat', 'NWLong', 'SELat', 'SELong']
def getData(address, key):
    g = geocoder.mapquest(address, key=key)
    lat = g.lat
    lng = g.lng
    h = geolib.geohash.encode(lat, lng, 7)
    hashes = geolib.geohash.neighbours(h)
    NW = geohash.decode(hashes.nw)
    SE = geohash.decode(hashes.ne)
    nwlat = NW.lat
    nwlon = NW.lon
    selat = SE.lat
    selon = SE.lon

在'nwi'中创建'nwi'列的'nwi'will create'four columns'。在

通常我只返回nwlat,然后创建lambda

^{pr2}$

然后我会对我想要返回的其他3个变量的每个情况都这样做。但是我总共运行了4次而不是一次。在


Tags: csvkeyimportaddresspddecodelnglat
1条回答
网友
1楼 · 发布于 2024-06-09 19:51:31

你很亲密。您需要做的就是找出如何恰当地返回结果。您的功能需要如下所示:

def getData(address, key):
    ...
    NW = geohash.decode(hashes.nw)
    SE = geohash.decode(hashes.ne)

    return pd.Series(dict(zip(fields, [NW.lat, NW.lon,  SE.lat, SE.lon]))) 

然后可以使用Series.apply

^{pr2}$

这是因为getData返回一个Series对象(以fields作为索引)。apply将自动构造一个数据帧并返回结果。在

旁注:要将这些列连接到现有的df,请调用pd.concat

res = pd.concat([df, df['address'].apply(getData, key=key)], axis=1)

另一个选择是使用列表理解,如果数据帧中没有nan。这是一个性能(和内存)微优化。在

^{4}$

关于列表理解及其好处的更多信息已经在我的帖子中详细介绍:For loops with pandas - When should I care?

相关问题 更多 >