使用 Geopy 返回基于国家/地区短代码的 pandas 列

Return pandas column base on country short code with Geopy

提问人:Jay Cheng 提问时间:9/10/2022 更新时间:9/10/2022 访问量:77

问:

我有一个包含大约 100k 行的数据帧,我想根据 geopy 的国家短代码找到坐标。

原始数据帧如下所示:

指数 国家 城市
0 CL系列 圣地亚哥
1 巴西 圣保罗
2 巴西 伊图佩娃

为了限制请求的数量,我创建了另一个具有唯一“国家/地区”值的数据帧,然后使用以下代码从 Geopy 中查找位置详细信息:

from geopy.geocoders import Nominatim    
from geopy.extra.rate_limiter import RateLimiter    
country_list = raw_df.country.unique().tolist()    
short_code_df["location"] = short_code_df["short_code"].apply(geocode,language="en")

这返回给我以下 df:

| index | short_code |                   location                   |
|-------|------------|----------------------------------------------|
|     0 | CL         | (Chile, (-31.7613365, -71.3187697))          |
|     1 | BR         | (Brazil, (-10.3333333, -53.2))               |
|     2 | US         | (United States, (39.7837304, -100.445882))   |
|     3 | GB         | (United Kingdom, (54.7023545, -3.2765753))   |
|     4 | JP         | (Japan, (36.5748441, 139.2394179))           |
|     5 | CH         | (Switzerland, (46.7985624, 8.2319736))       |
|     6 | CN         | (China, (35.000074, 104.999927))             |
|     7 | HK         | (Hong Kong, China, (22.350627, 114.1849161)) |

我想要的是将 Country、Lat、Lon 归还给它们各自的列,如下所示:

| index | short_code |      location        |      lat       |        lon     |
|-------|------------|----------------------|----------------|----------------|
|     0 | CL         | Chile                |    -31.7613365 |   - 71.3187697 |
|     1 | BR         | Brazil               |    -10.3333333 |          -53.2 |
|     2 | US         | United States        |     39.7837304 |     100.445882 |

我试图在最后用方括号切开它,但它给了我一个错误。

我还尝试使用熊猫爆炸功能,但这也不起作用。

首先感谢您的帮助。

Python Pandas 数据帧 地理

评论


答:

1赞 slymore 9/10/2022 #1

您可以使用来解决此问题。该方法根据以下类型略有不同:列是否包含元组或字符串?Series.applylocation

如果包含元组 (tuple[str, tuple[float, float]):location


import pandas as pd

df = pd.DataFrame(
    {
        "short_code": ["CL", "BR", "US"],
        "location": [
        ("Chile", (-31.7613365, -71.3187697)),
        ("Brazil", (-10.3333333, -53.2)),
        ("United States", (39.7837304, -100.445882))
    ]
    }
)

使用 apply:


df["country"] = df["location"].apply(lambda x: x[0])
df["lat"] = df["location"].apply(lambda x: x[1][0])
df["lon"] = df["location"].apply(lambda x: x[1][1])

您将获得:enter image description here

如果 location 是字符串

df = pd.DataFrame(
    {
        "short_code": ["CL", "BR", "US"],
        "location": [
        "(Chile, (-31.7613365, -71.3187697))",
        "(Brazil, (-10.3333333, -53.2))",
        "(United States, (39.7837304, -100.445882))"
    ]
    }
)

在这种情况下,您可以先使用正则表达式将其解析并转换为元组,然后应用与上述相同的步骤location

import re
import ast


def parse_location_str(loc_str: str):
    pattern = re.compile(r'\((?P<country>.*?),(?P<coord>.*)\)')
    m = pattern.search(loc_str)
    if m is None:
        return None
    country = m.group('country')
    coords = ast.literal_eval(m.group('coord'))
    return (country, coords)

df['loc_parsed'] = df['location'].apply(parse_location_str)
df["country"] = df["loc_parsed"].apply(lambda x: x[0])
df["lat"] = df["loc_parsed"].apply(lambda x: x[1][0])
df["lon"] = df["loc_parsed"].apply(lambda x: x[1][1])

您将获得:enter image description here