我正在学习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)"
发布于 2018-06-16 13:22:07
请看我下面的方法。它基于创建一个包含lat
和lon
列的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)
发布于 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%的时间,因为它检查数据的次数更少)。值得注意的是,该示例的输出在每一列中都有字符串,因此您可能需要修改以使值返回浮点数。
发布于 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()很慢。
https://stackoverflow.com/questions/50885024
复制相似问题