获取纬度/经度Python Pandas

时间:2018-06-16 04:42:23

标签: python pandas dataframe apply

我正在学习python,我正在尝试从“位置”列中解析出经度和纬度,并将它们分配给“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从数据帧中的最后一个单元复制到所有'lat'和'lon'行。我希望它分割它正在迭代的当前行,为该行分配'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)"

3 个答案:

答案 0 :(得分:2)

请参阅下面的方法。它基于创建包含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)

答案 1 :(得分:1)

这解决了您可以用来获得答案的另一种技术,但不是您需要的确切代码。如果您添加样本数据,我可以定制它。

使用Pandas构建的str方法可以为您节省一些麻烦,如下所示:

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

上面将“位置”列拆分为空格,然后将拆分值转换为列。然后,您可以仅将纬度和经度列分配给原始df。

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

str.split()也有一个expand参数,这样你就可以编写.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%的时间,因为它通过数据的次数更少)。值得注意的是,该示例的输出在每列中都有字符串,因此您可能需要修改以将值返回到浮点数。

答案 2 :(得分:0)

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()很慢。