从熊猫构造一个DataFrame应用

时间:2019-02-27 23:17:34

标签: python pandas dataframe apply

我有一个返回纬度和经度信息的函数。我想在数据框中为这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

我想在数据框中创建四个列,这些列将为“ nwlat”,“ nwlon”,“ selat”,“ selon”创建列。

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

df['NWLong'] = df.apply(lambda row: getData(row['a'], key), axis = 1)

然后我将针对要返回的其他3个变量的每种情况进行此操作。但是,我总共运行了4次,而不是一次。

1 个答案:

答案 0 :(得分:4)

您距离很近。您需要做的只是弄清楚如何适当地返回结果。您的函数将需要如下所示:

Series.apply

然后您可以使用df = pd.DataFrame({'address': ['Los Angeles, CA']}) # for example df['address'].apply(getData, key=key) NWLat NWLong SELat SELong 0 34.0541839599609375 -118.2451629638671875 34.0541839599609375 -118.2424163818359375

getData

通过让fields返回Series对象(以apply作为索引)来工作。 df随后将自动构造一个DataFrame并返回结果。

旁注:要将这些列连接到现有的pd.concat,请调用res = pd.concat([df, df['address'].apply(getData, key=key)], axis=1)

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

    return [NW.lat, NW.lon,  SE.lat, SE.lon]

pd.DataFrame([getData2(a, key) for a in df['address']], columns=fields)

                 NWLat                 NWLong                SELat                 SELong
0  34.0541839599609375  -118.2451629638671875  34.0541839599609375  -118.2424163818359375

如果您的DataFrame中没有NaN,则另一个选择是使用列表推导。这是性能(AND内存)的微优化。

{{1}}

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