根据索引熊猫替换值

时间:2018-10-17 14:10:02

标签: pandas indexing replace

我正在使用一个数据集,其中一个子集具有初始值和最终值。我创建了一个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 个答案:

答案 0 :(得分:2)

GroupBy.transformlast一起使用-它还替换了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

如果要仅替换重复的id行(原因是许多唯一值,因此性能更好):

mask = df.duplicated(subset=['id'], keep=False)
df.loc[mask, 'value'] = df[mask].groupby('id')['value'].transform('last')

答案 1 :(得分:2)

没有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