我有两个数据框:
我编写了一个函数,用于在两个数据框中搜索城市名称,并返回经度和纬度:
def ret_longlat(city_name):
if sum(df_cities["city"] == city_name) > 0:
long = df_cities["lon"][df_cities["city"] == city_name].iloc[0]
lat = df_cities["lat"][df_cities["city"] == city_name].iloc[0]
else:
long = 0
lat = 0
return long,lat
下一步,我将此功能应用于df1的所有城市名称,并将结果保存在新列中:
df_result["long"] = df_result["city_names"].apply(lambda x: ret_longlat(x)[0])
df_result["lat"] = df_result["city_names"].apply(lambda x: ret_longlat(x)[1])
整个过程耗时相对较长(我想说12162行需要5分钟)。
有没有办法改进代码?
示例数据:
df1
city
1 stadtA
2 stadtB
3 stadtu
4 stadty
5 stadtX
df2
city lat lon
14 stadtD 50.611879 12.135526
24 stadtA 48.698890 9.842890
25 stadtC 52.947222 12.849444
26 stadtB 52.867370 12.813750
27 stadtY 52.985000 12.854444
答案 0 :(得分:1)
这是合并问题。您可以执行左合并,然后填充缺少的值:
res = pd.merge(df1.rename(columns={'city_names': 'city'}),
df2[['city', 'long', 'lat']].drop_duplicates('city'),
how='left', on='city')
res[['long', 'lat']] = res[['long', 'lat']].fillna(0)