können Sie mask
verwenden für alle Werte, ohne vorher zu NaN
durch die Maske von duplicated
und dann durch forward filling
von ffill
(fillna
mit method='ffill'
) repalce NaN
erstellt ersetzen:
df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill()
Eine andere Lösung ist Verwenden Sie transform
+ first
:
g = df.groupby('id')
df['region'] = g['region'].transform('first')
df['date'] = g['date'].transform('first')
Letzte Lösung ist Aggregat first
, entfernen Spalte region
und und join
s
:
s = df.groupby('id')['date','region'].first()
df = df.drop(['date','region'], axis=1).join(s, on='id')
Probe:
df = pd.DataFrame({'id':[123,123,221,221,221],
'date':pd.to_datetime(['2017/05/22','2017/05/21',
'2017/05/11','2017/05/10','2017/05/09']),
'region':['region1','region2','region3','region4','region5'],
'num field':[1,2,3,4,5]})
print (df)
date id num field region
0 2017-05-22 123 1 region1
1 2017-05-21 123 2 region2
2 2017-05-11 221 3 region3
3 2017-05-10 221 4 region4
4 2017-05-09 221 5 region5
df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill()
print (df)
date id num field region
0 2017-05-22 123 1 region1
1 2017-05-22 123 2 region1
2 2017-05-11 221 3 region3
3 2017-05-11 221 4 region3
4 2017-05-11 221 5 region3