【问题标题】:Matching names between two columns of two dataframes and adding new columns to one - long computing time匹配两个数据帧的两列之间的名称并添加新列以延长计算时间
【发布时间】:2019-01-30 12:45:26
【问题描述】:

我有两个数据框:

  • 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

【问题讨论】:

  • 最终期望的输出是什么?
  • df_result 数据框的新列
  • 我们需要看看它应该是什么样子以及输入是什么样子
  • 添加输入示例

标签: python pandas dataframe


【解决方案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)

【讨论】:

  • 我得到:KeyError: "['lat'] not in index" - 添加示例 df
  • @Phil,哪一行?
  • 在 res[['long', 'lat']] = res[['long', 'lat']].fillna(0)
  • 你对res.columns有什么看法?
  • 这意味着df1 在您的合并之前已经有latlong 列。这与您在问题中指定的输入不同。如果您不需要旧数据,请先从 df1 中删除这些列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多