我有一個如下所示的輸入資料框:
df = pd.DataFrame.from_dict({"t": [1,2,3,4,5], 'val': [100, 5, -4, -9, 1], })
我需要計算以下兩列,一列是自上次正值以來的時間,一列是自上次負值以來的時間:
df['t_since_neg'] = [np.nan, np.nan, np.nan, 1, 1]
df['t_since_pos'] = [np.nan, 1, 1,2,3]
該列t代表時間。我該怎么做呢?我知道它與 . 有關系diff,但我無法讓它完全正常作業。
更新(后續問題):如果我有一個額外的列'id',我將如何做到這一點,并且計算需要在每個組內單獨完成,即每個組彼此獨立?
uj5u.com熱心網友回復:
解決方案
m = df.val > 0
df['t_since_neg'] = df['t'] - df['t'].where(~m).ffill().shift()
df['t_since_pos'] = df['t'] - df['t'].where( m).ffill().shift()
t val t_since_neg t_since_pos
0 1 100 NaN NaN
1 2 5 NaN 1.0
2 3 -4 NaN 1.0
3 4 -9 1.0 2.0
4 5 1 1.0 3.0
解釋
要計算t_since_pos,首先屏蔽時間列中對應val為負的值,然后前向填充和移位以傳播與最后一個正值對應的時間,最后從原始時間列中減去它。同樣的方法可以用來計算t_since_neg
>>> df['t'].where(m)
0 1.0
1 2.0
2 NaN
3 NaN
4 5.0
Name: t, dtype: float64
>>> .ffill().shift()
0 NaN
1 1.0
2 2.0
3 2.0
4 2.0
Name: t, dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480599.html
