![](/img/trans.png)
[英]Pandas dataframe add new column based on if other columns have data or not
[英]Pandas: Add new dataframe column based on the dates of other smaller dataframe
我有一個看起來像這樣的數據框(鏈接到 csv ):
time , value
0 , 10
1 , 20
2 , 35
3 , 30
4 , 40
5 , 40
6 , 60
我想根據這個較小的數據框(鏈接到 csv )中的值填充另一列recentActive
:
time , value , activatedTime , deactivatedTime
1 , 20 , 1 , 5
3 , 30 , 3 , 4
在recentActive
列中,我們應該有尚未停用的最新激活值。 一旦一個值被停用,那么我們應該用以前仍然有效的值填充它。 最終的數據框應該是這樣的:
time , value , recentActive
0 , 10 , NaN
1 , 20 , 20 (t=1 activated)
2 , 30 , 20
3 , 30 , 30 (t=3 activated)
4 , 40 , 30 (t=3 deactivated)
5 , 40 , 20 (t=1 deactivated)
6 , 60 , NaN (no active values)
我怎樣才能做到這一點? 最好只使用矢量化操作,謝謝!
如果您想要一個高性能的解決方案,實現起來有點復雜。
您可以構建一個IntervalIndex
,包括一個“包羅萬象”的間隔(最小-最大,否則切片將因缺失值而失敗),然后切片並聚合潛在的多個間隔與groupby.last
匹配以僅保留每個初始值的第一個價值。
這假定df1
和df2
作為輸入,並要求df2
在activatedTime
上排序。
import numpy as np
idx = pd.IntervalIndex.from_arrays(np.r_[df1['time'].min(), df2['activatedTime']],
np.r_[df1['time'].max(), df2['deactivatedTime']],
closed='both')
intervals = pd.Series(np.r_[np.nan, df2['value']]).set_axis(idx)
s = intervals.loc[df1['time']]
# make groups if intervals are increasing
group = s.index.left.to_series().diff().le(0).cumsum()
df1['recentActive'] = s.groupby(group.to_numpy()).last()
輸出:
time value recentActive
0 0 10 NaN
1 1 20 20.0
2 2 35 20.0
3 3 30 30.0
4 4 40 30.0
5 5 40 20.0
6 6 60 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.