2017-06-21 40 views
1

我有列数据框更新旧的行值 - 编号,日期,区域,some_numeric_fields与最近的行

ID和日期标识唯一喜欢的主键整行。我的数据框按日期按降序排列。

我想要的是将区域的所有值替换为最近的日期行匹配的id和相同的日期字段,并保持数字字​​段完好。

采样输入

enter image description here

样本输出

enter image description here

的数据太大,所以我不喜欢通过每行进行迭代,而不是我想要的东西更快。

感谢

回答

1

可以使用mask一种通过duplicated和形成的遮掩替换所有值,而不先NaN然后repalce NaN通过forward fillingffillfillnamethod='ffill'):

df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill() 

另一种解决方案是使用transform + first

g = df.groupby('id') 
df['region'] = g['region'].transform('first') 
df['date'] = g['date'].transform('first') 

最后的解决方案是聚集first,删除列region和和joins

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