如何将经纬度坐标字符串分成两列?
Posted
技术标签:
【中文标题】如何将经纬度坐标字符串分成两列?【英文标题】:How do I separate lat-long coordinate strings into two columns? 【发布时间】:2021-12-11 12:36:02 【问题描述】:我正在使用这个数据集:https://opendataportal-lasvegas.opendata.arcgis.com/datasets/restaurant-inspections-open-data/explore
在这个数据集中,有一个特征'Location_1'
涉及到餐厅的位置坐标:
Location_1
0 (36.12976350, -115.31507320)
1 (36.10882500, -115.32125900)
2 (36.07411000, -115.08284000)
3 (36.07411000, -115.08284000)
4 (36.12734880, -115.14185020)
我想在我的 DataFrame 中创建两个新列,一列用于纬度,一列用于经度。
我天真地尝试先用命令生成列向量
lat = df['Location_1'][:,0]
long = df['Location_1'][:,1]
但它不起作用。看起来df['Location_1']
中的条目是字符串。
例如,我尝试过
In [5]: df['Location_1'][1][1:30]
Out[5]: '36.10882500, -115.32125900)'
但我想在纬度和经度列中获得浮点数。
【问题讨论】:
当你运行df.dtypes
时,位置会出现什么?
我认为它们是字符串,如果它们是浮点数,你可以这样做df['lat'], df['long'] = zip(*df['Location_1'])
。
【参考方案1】:
处理完字符串后,可以使用.apply
将pd.Series
映射到每一列:
In [2]: df
Out[2]:
Location_1
0 (36.12976350, -115.31507320)
1 (36.10882500, -115.32125900)
2 (36.07411000, -115.08284000)
3 (36.07411000, -115.08284000)
4 (36.12734880, -115.14185020)
In [3]: df = df.Location_1.str.strip("()").str.split(", ")
In [4]: df = df.apply(pd.Series).astype(float).rename(columns=0: "lat", 1: "lng")
In [5]: df
Out[5]:
lat lng
0 36.129764 -115.315073
1 36.108825 -115.321259
2 36.074110 -115.082840
3 36.074110 -115.082840
4 36.127349 -115.141850
或者在一行中:
df = df.Location_1.str.strip("()").str.split(", ").apply(pd.Series).astype(float)
如果需要,请添加重命名:.rename(columns=0: "lat", 1: "lng")
【讨论】:
我在实际的数据集上试过这个,但它不起作用。 我不知道您的数据是字符串。我已经更新了我的解决方案以正确处理字符串。【参考方案2】:这也有效:
df=df['Location_1'].str.split(pat=None, n=-1, expand=True)
df[0] = df[0].str[1:]
df[0] = df[0].str[:-1]
df[1] = df[1].str[:-1]
【讨论】:
【参考方案3】:我下载了文件并使用以下代码,result.csv 包含您所期望的两列。
import pandas as pd
df = pd.read_csv('raw_data.csv', low_memory=False)
df[['latitude', 'longitude']] = df['Location_1'].str.extract(pat = '(-?\d+\.\d+),\s*(-?\d+\.\d+)')
df.to_csv('result.csv')
【讨论】:
以上是关于如何将经纬度坐标字符串分成两列?的主要内容,如果未能解决你的问题,请参考以下文章