我正在学习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)"
答案 0 :(得分:2)
请参阅下面的方法。它基于创建包含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)
答案 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
@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()很慢。