通过来自另一个DataFrame的行将新列映射到DataFrame

时间:2018-11-25 09:02:36

标签: python pandas performance numpy dataframe

我有一个ID为ID的Pandas DataFrame stations

id    station     lat     lng
1     Boston      45.343  -45.333
2     New York    56.444  -35.690

我有另一个具有以下内容的DataFrame df1

duration   date       station   gender
NaN        20181118   NaN       M
9          20181009   2.0       F
8          20170605   1.0       F

我想添加到df1中,使其看起来像下面的DataFrame:

duration   date       station   gender  lat     lng 
NaN        20181118   NaN       M       nan     nan
9          20181009   New York  F       56.444  -35.690
8          20170605   Boston    F       45.343  -45.333

我尝试通过参考下面的示例中的station.iloc[]来迭代地执行此操作,但是我大约有200万行,并且这花了很多时间。

stat_list = []    
lng_list []
lat_list = []
for stat in df1:
  if not np.isnan(stat):
        ref = station.iloc[stat]
        stat_list.append(ref.station)
        lng_list.append(ref.lng)
        lat_list.append(ref.lat)
  else:
        stat_list.append(np.nan)
        lng_list.append(np.nan)
        lat_list.append(np.nan)

有更快的方法吗?

1 个答案:

答案 0 :(得分:1)

看起来最好通过合并来解决,这应该可以大大提高性能:

df1.merge(stations, left_on="station", right_index=True, how="left")

如果您只希望其中包含字符串名称的桩号列,则会留下两列station_xstation_y

df_merged = df1.merge(stations, left_on="station", right_index=True, how="left", suffixes=("_x", ""))
df_final = df_merged[df_merged.columns.difference(["station_x"])]

(或在合并之前重命名其中之一)