提问人:Jay Cheng 提问时间:9/10/2022 更新时间:9/10/2022 访问量:77
使用 Geopy 返回基于国家/地区短代码的 pandas 列
Return pandas column base on country short code with Geopy
问:
我有一个包含大约 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 |
我试图在最后用方括号切开它,但它给了我一个错误。
我还尝试使用熊猫爆炸功能,但这也不起作用。
首先感谢您的帮助。
答:
1赞
slymore
9/10/2022
#1
您可以使用来解决此问题。该方法根据以下类型略有不同:列是否包含元组或字符串?Series.apply
location
如果包含元组 (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])
如果 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])
评论