首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取经度/纬度Python Pandas

获取经度/纬度Python Pandas
EN

Stack Overflow用户
提问于 2018-06-16 12:42:23
回答 3查看 2K关注 0票数 -1

我正在学习python,目前正在尝试从"Location“列中解析出经度和纬度,并将它们分配给”lat“和”lon“列。我目前有以下代码:

def getlatlong(cell):
    dd['lat'] = cell.split('\n')[2].split(',')[0][1:]
    dd['lon'] = cell.split('\n')[2].split(',')[1][1:-1]

dd['Location'] = dd['Location'].apply(getlatlong)

dd.head()

代码的拆分部分可以工作。问题是,这段代码将数据帧中最后一个单元格的经度和经度复制到所有‘经度’和‘经度’行。我希望它拆分正在遍历的当前行,为该行分配'lat‘和'lon’值,然后对每个后续行执行相同的操作。

我知道将dd‘’lat‘赋值给拆分值会将其赋值给整个列,但我不知道如何仅赋值给当前正在迭代的行。

应请求提供的数据样本:

Index,Location
0,"1554 FIRST ST\nLIVERMORE, CA 94550\n(37.67930642, -121.7765857)"
1,"1554 FIRST ST\nLIVERMORE, CA 94550\n(37.67931141, -121.7765988)"
2,"138 14TH ST\nOAKLAND, CA 94612\n(37.80140803, -122.26369831)"
3,"4014 MACARTHUR BLVD\nOAKLAND, CA 94619\n(37.78968061, -122.19690846)"
4,"4014 MACARTHUR BLVD\nOAKLAND, CA 94619\n(37.78968557, -122.19692165)"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-16 13:22:07

请看我下面的方法。它基于创建一个包含latlon列的dataframe,然后将其添加到现有的数据帧中。

def getlatlong(x):
    return pd.Series([x.split('\n')[2].split(',')[0][1:], 
                      x.split('\n')[2].split(',')[1][1:-1]],
                      index = ["lat", "lon"])

df = pd.concat((df, df.Location.apply(getlatlong)), axis=1)
票数 2
EN

Stack Overflow用户

发布于 2018-06-16 15:51:48

这解决了您可以用来获得答案的另一种技术,但这并不是您需要的确切代码。如果您添加示例数据,我可以对其进行调整。

使用Pandas的内置str方法,您可以省去一些麻烦,如下所示:

temp_df = df['Location'].str.split('\n').str.split().apply(pd.Series)

上面的代码在空格上拆分位置列,然后将拆分值转换为列。然后,您可以仅将纬度和经度列指定给原始df。

df[['Latitude', 'Longitude']] = temp_df[[<selection1>, <selection2>]]

str.split()还有一个展开参数,这样您就可以编写.str.split("char",expand=True)来展开列而不使用apply。

更新

以您的示例为例,这适用于您的特定情况:

df = pd.DataFrame({"Location": ["1554 FIRST ST\nLIVERMORE, CA 94550\n(37.67930642, -121.7765857)"]})
df[["Latitude", "Longitude"]] = (df['Location']
                                 .str.split('\n')
                                 .apply(pd.Series)[2]  # Column 2 has the str (lat, long)
                                 .str[1:-1]  # Strip the ()
                                 .str.split(",", expand=True)  # Expand latitude and longitude into two columns
                                 .astype(float))  # Make sure latitude and longitude are floats

Out:
    Location                                            Latitude    Longitude
0   1554 FIRST ST\nLIVERMORE, CA 94550\n(37.679306...   37.679306   -121.776586

更新#2

@Abhishek Mishra的回答更快(只需要55%的时间,因为它检查数据的次数更少)。值得注意的是,该示例的输出在每一列中都有字符串,因此您可能需要修改以使值返回浮点数。

票数 1
EN

Stack Overflow用户

发布于 2018-06-16 12:47:46

for ind, row in dd.iterrows():
    dd['lat'].loc[ind] = dd['Location'].loc[ind].split(',')[0][1:]
    dd['lon'].loc[ind] = dd['Location'].loc[ind].split(',')[1][1:-1]

PS: iterrows()很慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50885024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档