我的数据框包含列 - id,date,region,some_numeric_fields
id和date标识整个行,就像主键一样。我的数据框按日期降序排序。
我想要的是用匹配id的最新日期行替换区域的所有值,并将日期字段替换为相同的值,并保持数字字段不变。
示例输入
示例输出
数据太大,所以我不喜欢遍历每一行,而是想要更快的东西。
由于
答案 0 :(得分:1)
您可以使用mask
替换所有值,而无需先通过duplicated
创建的掩码NaN
替换所有值,然后NaN
再forward filling
ffill
(fillna
与method='ffill'
):
df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill()
g = df.groupby('id')
df['region'] = g['region'].transform('first')
df['date'] = g['date'].transform('first')
上一个解决方案是汇总first
,删除列region
和join
s
:
s = df.groupby('id')['date','region'].first()
df = df.drop(['date','region'], axis=1).join(s, on='id')
样品:
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