繁体   English   中英

如何在 dataframe 中的第 n 行 select 以及基于每日间隔的前几行的条件

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM