我正在使用一个数据集,其中一个子集具有初始值和最终值。我创建了一个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
我想念什么? 谢谢
答案 0 :(得分:2)
将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
如果要仅替换重复的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