2017-06-21 73 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