[英]How to select every n-th row in dataframe with condition of previous rows based on daily interval
我有一個很大的 dataframe,我需要一個值為 0 或 1 的新列sig
。
條件:
在每天 08:30 開始的第 3 行添加值 = 1,如果第 3 行中的data
data
data
,否則為 0
局限性:在原來的dataframe中,時間戳中秒的間隔不相等,所以不能按時間間隔來計算go。 每天的行數各不相同。
示例 dataframe(我不知道如何隨機化秒數,所以這里的間隔相等,行數也相等):
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 500)
np.random.seed(100)
dates = pd.date_range("2022.01.01", "2022.01.31", freq="s")
dates=dates[:-1]
df = pd.DataFrame({'date':dates,
'data':np.random.randint(low=0, high=100, size=len(dates)).tolist()})
df['_date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df = df.loc[(df._date.dt.hour == 8) & (df._date.dt.minute == 30) & ((df._date.dt.second >= 0) & (df._date.dt.second <= 10))].head(30)
df.drop(['_date'], axis=1, inplace=True)
data
date
2022-01-01 08:30:00 14
2022-01-01 08:30:01 27
2022-01-01 08:30:02 33
2022-01-01 08:30:03 77
2022-01-01 08:30:04 66
2022-01-01 08:30:05 60
2022-01-01 08:30:06 72
2022-01-01 08:30:07 21
2022-01-01 08:30:08 70
2022-01-01 08:30:09 60
2022-01-01 08:30:10 76
2022-01-02 08:30:00 13
2022-01-02 08:30:01 73
2022-01-02 08:30:02 71
2022-01-02 08:30:03 78
2022-01-02 08:30:04 50
2022-01-02 08:30:05 80
2022-01-02 08:30:06 48
2022-01-02 08:30:07 24
2022-01-02 08:30:08 29
2022-01-02 08:30:09 43
2022-01-02 08:30:10 75
2022-01-03 08:30:00 11
2022-01-03 08:30:01 52
如何做到這一點?
期望的結果:
data sig
date
2022-01-01 08:30:00 14 0
2022-01-01 08:30:01 27 0
2022-01-01 08:30:02 33 1
2022-01-01 08:30:03 77 0
2022-01-01 08:30:04 66 0
2022-01-01 08:30:05 60 0
2022-01-01 08:30:06 72 0
2022-01-01 08:30:07 21 0
2022-01-01 08:30:08 70 0
2022-01-01 08:30:09 60 0
2022-01-01 08:30:10 76 0
2022-01-02 08:30:00 13 0
2022-01-02 08:30:01 73 0
2022-01-02 08:30:02 71 0
2022-01-02 08:30:03 78 0
2022-01-02 08:30:04 50 0
2022-01-02 08:30:05 80 0
2022-01-02 08:30:06 48 0
2022-01-02 08:30:07 24 0
2022-01-02 08:30:08 29 0
2022-01-02 08:30:09 43 0
2022-01-02 08:30:10 75 0
2022-01-03 08:30:00 11 0
2022-01-03 08:30:01 32 0
2022-01-03 08:30:02 52 1
2022-01-03 08:30:03 44 0
2022-01-03 08:30:03 75 0
我用你的代碼來創建輸入數據,但它看起來與你的打印版本有點不同:
data
date
2022-01-01 08:30:00 14
2022-01-01 08:30:01 27
2022-01-01 08:30:02 33
2022-01-01 08:30:03 77
2022-01-01 08:30:04 66
2022-01-01 08:30:05 60
2022-01-01 08:30:06 72
2022-01-01 08:30:07 21
2022-01-01 08:30:08 70
2022-01-01 08:30:09 60
2022-01-01 08:30:10 76
2022-01-02 08:30:00 13
2022-01-02 08:30:01 73
2022-01-02 08:30:02 71
2022-01-02 08:30:03 78
2022-01-02 08:30:04 50
2022-01-02 08:30:05 80
2022-01-02 08:30:06 48
2022-01-02 08:30:07 24
2022-01-02 08:30:08 29
2022-01-02 08:30:09 43
2022-01-02 08:30:10 75
2022-01-03 08:30:00 11
2022-01-03 08:30:01 52
2022-01-03 08:30:02 40
2022-01-03 08:30:03 30
2022-01-03 08:30:04 44
2022-01-03 08:30:05 71
2022-01-03 08:30:06 64
2022-01-03 08:30:07 60
您的規則可以描述為 3 行的滾動 window,檢查 window 是否已經排序(value3 大於 2 大於 1)。 知道我們可以在整個數據上使用這個條件(不注意date
)並創建一個系列,如果條件為真,值為 1,如果條件為假,值為 0(命名為cond
)然后搜索每一天的第三個值和 map該索引的cond
與新列一致。
def window_sorted(grp):
return (np.diff(grp) > 0).all()
cond = df['data'].rolling(window=3, min_periods=1).apply(window_sorted)
df['sig'] = 0
grp = df.groupby(pd.Grouper(level=0, freq='D'), as_index=False)['data'].nth(2).index
df.loc[grp, 'sig'] = cond[grp]
print(df)
Output:
data sig
date
2022-01-01 08:30:00 14 0
2022-01-01 08:30:01 27 0
2022-01-01 08:30:02 33 1
2022-01-01 08:30:03 77 0
2022-01-01 08:30:04 66 0
2022-01-01 08:30:05 60 0
2022-01-01 08:30:06 72 0
2022-01-01 08:30:07 21 0
2022-01-01 08:30:08 70 0
2022-01-01 08:30:09 60 0
2022-01-01 08:30:10 76 0
2022-01-02 08:30:00 13 0
2022-01-02 08:30:01 73 0
2022-01-02 08:30:02 71 0
2022-01-02 08:30:03 78 0
2022-01-02 08:30:04 50 0
2022-01-02 08:30:05 80 0
2022-01-02 08:30:06 48 0
2022-01-02 08:30:07 24 0
2022-01-02 08:30:08 29 0
2022-01-02 08:30:09 43 0
2022-01-02 08:30:10 75 0
2022-01-03 08:30:00 11 0
2022-01-03 08:30:01 52 0
2022-01-03 08:30:02 40 0
2022-01-03 08:30:03 30 0
2022-01-03 08:30:04 44 0
2022-01-03 08:30:05 71 0
2022-01-03 08:30:06 64 0
2022-01-03 08:30:07 60 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.