1
我有列数据框更新旧的行值 - 编号,日期,区域,some_numeric_fields与最近的行
ID和日期标识唯一喜欢的主键整行。我的数据框按日期按降序排列。
我想要的是将区域的所有值替换为最近的日期行匹配的id和相同的日期字段,并保持数字字段完好。
采样输入
样本输出
的数据太大,所以我不喜欢通过每行进行迭代,而不是我想要的东西更快。
感谢
我有列数据框更新旧的行值 - 编号,日期,区域,some_numeric_fields与最近的行
ID和日期标识唯一喜欢的主键整行。我的数据框按日期按降序排列。
我想要的是将区域的所有值替换为最近的日期行匹配的id和相同的日期字段,并保持数字字段完好。
采样输入
样本输出
的数据太大,所以我不喜欢通过每行进行迭代,而不是我想要的东西更快。
感谢
可以使用mask
一种通过duplicated
和形成的遮掩替换所有值,而不先NaN
然后repalce 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