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