[英]Pandas conditional ffill
我正在嘗試實現以下目標:開始應該為零,直到 R 列低於 20,然后為正,直到 R 列高於 80,並且循環應該重復(重置)。 直到第 19 行,行為與預期一致,但在第 20 行,盡管不匹配標准,但 Start 莫名其妙地設置為 1。 添加額外的列很好。
df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R'])
df['Start'] = np.where((df.R < 20), 1, 0)
df['End'] = np.where((df.R > 80), 1, 0)
df.loc[df['End'].shift().eq(0), 'Start'] = df['Start'].replace(0, np.nan).ffill().fillna(0).astype(int)
R Start End
11 82 0 1
12 63 0 0
13 37 0 0
14 21 0 0
15 88 0 1
16 9 1 0
17 13 1 0
18 83 1 1
19 47 0 0
20 68 1 0
21 42 1 0
22 67 1 0
23 26 1 0
24 79 1 0
25 87 1 1
26 96 0 1
27 39 0 0
28 50 1 0
29 94 1 1
30 95 0 1
根據 Quang Hoang 的回答解決方案:
df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R'])
df['Start'] = np.select([df['R'] < 20, df['R'] > 80], (1,0), np.nan)
df['Start'] = df['Start'].ffill()
df['Start'] = df.Start.combine(pd.Series(np.insert(abs(np.diff(df.Start)), 0, 0)), max, fill_value=0)
IIUC,您可以使用np.select
:
df['Start'] = np.select([df['R']>80, df['R']<20], (1,0), np.nan)
df['Start'] = df['Start'].ffill()
Output:
R Start End
11 82 1.0 1
12 63 1.0 0
13 37 1.0 0
14 21 1.0 0
15 88 1.0 1
16 9 0.0 0
17 13 0.0 0
18 83 1.0 1
19 47 1.0 0
20 68 1.0 0
21 42 1.0 0
22 67 1.0 0
23 26 1.0 0
24 79 1.0 0
25 87 1.0 1
26 96 1.0 1
27 39 1.0 0
28 50 1.0 0
29 94 1.0 1
30 95 1.0 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.