代码之家  ›  专栏  ›  技术社区  ›  Alex Gao

使用one.map调用,使用一个字典更改dataframe中多个系列/列的值

  •  2
  • Alex Gao  · 技术社区  · 7 年前

    id latitude longitude
     a      -99        48
     b      -97        44
     c      -96        52
    

    我有一个字典把id映射到新的纬度+经度值

    new_lat_lon = { 'a':(-99, 58), 'b':(...), 'c':(...) }
    

    例如

    df[['latitude', 'longitude']] = df['id'].map(new_lat_lon)
    

    这当然不行,但如果有办法我想知道的话。我知道我可以简单地把字典分成两个独立的字典,但我感兴趣的是是否有一个更紧凑的解决方案。如果我需要修改字典一点(比如把元组改成列表或其他什么),那也很酷,只要是一个字典。谢谢您!

    2 回复  |  直到 7 年前
        1
  •  5
  •   rafaelc    7 年前

    使用 update

    pd.DataFrame.from_dict(new_lat_lon,'index').rename(columns={0:'latitude',1:'longitude'})
    Out[128]: 
       latitude  longitude
    a       -99         58
    b         1          2
    c         2          3
    updateddf=pd.DataFrame.from_dict(new_lat_lon,'index').rename(columns={0:'latitude',1:'longitude'})
    df=df.set_index('id')
    df.update(updateddf)
    df.reset_index()
    Out[132]: 
      id  latitude  longitude
    0  a       -99         58
    1  b         1          2
    2  c         2          3
    
        2
  •  1
  •   rafaelc    7 年前

    您也可以使用 str.get

    vals = df.id.map(d)
    df.latitude, df.longitude = vals.str.get(0), vals.str.get(1)
    

    请注意,如果 id d

    如果不是,可以

    vals =df.id.map(d).fillna(df[['latitude', 'longitude']].agg(tuple,1))
    df.latitude, df.longitude = vals.str.get(0), vals.str.get(1)