代码之家  ›  专栏  ›  技术社区  ›  Juan C

基于索引替换值

  •  2
  • Juan C  · 技术社区  · 8 年前

    我使用的是一个数据集,其中一个子集有初始值和最终值。我创造了一个 id 这让我能够确定这些观察结果,所以在应用这些之后:

    df['aux']=df.duplicated(subset=['id'], keep=False)
    
    df_dup=df_dup[df_dup.aux==True]
    df_dup.sort_values(by='id').reset_index(inplace=True)
    

    我得到这样的结果:

    index     id    status    value
      88      1    'initial'    8
      95      1    'final'      12
      63      2    'initial'    9
      52      2    'final'      13
    

    我想要实现的是将最终值替换为初始值:

    index     id    status    value
      88      1    'initial'    12
      95      1    'final'      12
      63      2    'initial'    13
      52      2    'final'      13
    

    df_dup[df_dup.status=='initial'].reset_index().value= \
    df_dup[df_dup.status=='final'].reset_index().value
    

    但那充满了 initial 价值观 nan :

    index     id    status    value
      88      1    'initial'    nan
      95      1    'final'      12
      63      2    'initial'    nan
      52      2    'final'      13
    

    我错过了什么? 谢谢

    2 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    使用 GroupBy.transform 具有 last -它还取代了 id

    df['value'] = df.groupby('id')['value'].transform('last')
    print (df)
       index  id     status  value
    0     88   1  'initial'     12
    1     95   1    'final'     12
    2     63   2  'initial'     13
    3     52   2    'final'     13
    

    如果需要,只替换重复的 身份证件 行(因为有许多唯一的值,所以性能更好):

    mask = df.duplicated(subset=['id'], keep=False)
    df.loc[mask, 'value'] = df[mask].groupby('id')['value'].transform('last')
    
        2
  •  2
  •   BENY    8 年前

    groupby 基于你的 drop_duplicates

    df.value=df.id.map(df.drop_duplicates('id',keep='last').set_index('id').value)
    df
    Out[436]: 
       index  id     status  value
    0     88   1  'initial'     12
    1     95   1    'final'     12
    2     63   2  'initial'     13
    3     52   2    'final'     13