簡體   English   中英

Pandas 有條件填充

[英]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.

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