簡體   English   中英

熊貓:根據其他較小數據框的日期添加新的數據框列

[英]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匹配以僅保留每個初始值的第一個價值。

這假定df1df2作為輸入,並要求df2activatedTime上排序。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM