我有一個如下所示的 Pandas 資料框:
Day val
Day1 0
Day2 0
Day3 0
Day4 0
Day5 1
Day6 1
Day7 1
Day8 1
Day9 0
Day10 0
Day11 0
Day12 1
Day13 1
Day14 1
Day15 1
Day16 0
Day17 0
Day18 0
Day19 0
Day20 0
Day21 1
Day22 0
Day23 1
Day24 1
Day25 1
我希望提取最多 2 行,val = 0但只有那些行是一組 1 的行。
例如:
有一組從Day5到Day8(一個事件)。在活動結束后,我最多需要查看兩行。所以這里是Day9和Day10。
同樣,Day21是一個單日事件,我只需要查看,Day22因為它是事件之后的單個零。
對于上面的表資料,輸出如下:
Day val
day9 0
Day10 0
Day16 0
Day17 0
Day22 0
uj5u.com熱心網友回復:
我們可以將每一行的條件簡化為:
- 該
val值應為 0 - 前一天或前一天的值應
val為 1
在代碼中:
cond = (df['val'].shift(1) == 1) | (df['val'].shift(2) == 1)
df.loc[(df['val'] == 0) & cond]
結果:
Day val
8 Day9 0
9 Day10 0
15 Day16 0
16 Day17 0
21 Day22 0
注意:如果應考慮超過 2 天,這可以很容易地添加到條件中cond。在這種情況下,cond可以使用串列推導式和 構造np.any(),例如:
n = 2
cond = np.any([df['val'].shift(s) == 1 for s in range(1, n 1)], axis=0)
df.loc[(df['val'] == 0) & cond]
uj5u.com熱心網友回復:
您可以計算每組滾動最大值的掩碼,其中組從每個 1->0 轉換開始,并將其與值為 0 的第二個掩碼組合:
N = 2
o2z = df['val'].diff().eq(-1)
m1 = o2z.groupby(o2z.cumsum()).rolling(N, min_periods=1).max().astype(bool).values
m2 = df['val'].eq(0)
df[m1&m2]
輸出:
Day val
8 Day9 0
9 Day10 0
15 Day16 0
16 Day17 0
21 Day22 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368024.html
上一篇:AzureMLStudio本地環境—使用AzureMLPythonSDK的Numpy包匯入失敗
下一篇:回傳兩個二維陣列的差值
