在两个数据框的两列之间匹配名称,并将新列添加到一列中-计算时间长

时间:2019-01-30 12:45:26

标签: python pandas dataframe

我有两个数据框:

  • df1->所有德国城市的数据框,包括其名称和更多数据。
  • df2->所有德国城市的数据框及其经度和纬度

我编写了一个函数,用于在两个数据框中搜索城市名称,并返回经度和纬度:

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

1 个答案:

答案 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)