首页 > 解决方案 > 将自定义函数应用于数据框中列中的每一行

问题描述

我有一些代码可以提取一个位置的纬度和经度。是这里:

address = 'New York University'
url = 'https://nominatim.openstreetmap.org/search/' + urllib.parse.quote(address) +'?format=json'

response = requests.get(url).json()
print(response[0]["lat"])
print(response[0]["lon"])

我想将此作为函数应用于一长列“地址”。

我见过很多关于“应用”和“地图”的问题,但它们几乎都是简单的数学示例。

这是我昨晚尝试的:

def locate (address):
    response = requests.get(url).json()
    print(response[0]["lat"])
    print(response[0]["lon"])
    return

df['lat'] = df['lat'].map(locate)
df['lon'] = df['lon'].map(locate)

这最终只是将第一行 lat / lon 应用于整个 csv。

将代码转换为自定义函数并将其应用于每一行的最佳方法是什么?

提前致谢。

编辑:感谢@PacketLoss 的帮助。我得到一个 indexerror:list index out of range,但它确实适用于他的示例数据框。

这是我用来提取数据的 read_csv:

df = pd.read_csv('C:\\Users\\CIHAnalyst1\\Desktop\\InstitutionLocations.csv', sep=',', error_bad_lines=False, index_col=False, dtype='unicode', encoding = "utf-8",  warn_bad_lines=False)

这是数据框中行的文本副本:

address

0 大峡谷大学 1 南新罕布什尔大学 2 西部州长大学 3 佛罗里达国际大学 - 大学 ... 4 宾夕法尼亚州立大学大学公园 ... ... 4292 国际艺术学院有限责任公司 4293 INTERCOAST - 在线 4294 卡罗来纳大学4295 DYERSBURG 州立社区学院 科文顿 4296 ULTIMATE MEDICAL ACADEMY - NY

标签: pythonpandasfunction

解决方案


你需要从你的函数中返回你的值,否则什么都不会发生。

我们可以在这里使用 apply 并从 thedf中传递地址。

data = {'address': ['New York University', 'Sydney Opera House', 'Paris', 'SupeRduperFakeAddress']}

df = pd.DataFrame(data)

def locate(row):
    url = 'https://nominatim.openstreetmap.org/search/' + urllib.parse.quote(row['address']) +'?format=json'
    response = requests.get(url).json()
    if response:
        row['lat'] = response[0]['lat']
        row['lon'] = response[0]['lon']
    return row

df = df.apply(locate, axis=1)

输出

                 address           lat                 lon
0    New York University   40.72925325  -73.99625393609625
1     Sydney Opera House  -33.85719805  151.21512338473752
2                  Paris    48.8566969           2.3514616
3  SupeRduperFakeAddress           NaN                 NaN

推荐阅读