在同一天内按条件识别细胞



假设我有以下数据帧。我将如何获得一个带有 1 的额外列"标志",其中一天的年龄大于 90,并且仅当它连续 2 天(在本例中为 48 小时(发生时?输出应包含 2 天或更长时间的 1',具体取决于满足条件的天数 数据集要大得多,但我在这里只放了一小部分,以便您了解情况。

                     Age
Dates                   
2019-01-01 00:00:00   29
2019-01-01 01:00:00   56
2019-01-01 02:00:00   82
2019-01-01 03:00:00   13
2019-01-01 04:00:00   35
2019-01-01 05:00:00   53
2019-01-01 06:00:00   25
2019-01-01 07:00:00   23
2019-01-01 08:00:00   21
2019-01-01 09:00:00   12
2019-01-01 10:00:00   15
2019-01-01 11:00:00    9
2019-01-01 12:00:00   13
2019-01-01 13:00:00   87
2019-01-01 14:00:00    9
2019-01-01 15:00:00   63
2019-01-01 16:00:00   62
2019-01-01 17:00:00   52
2019-01-01 18:00:00   43
2019-01-01 19:00:00   77
2019-01-01 20:00:00   95
2019-01-01 21:00:00   79
2019-01-01 22:00:00   77
2019-01-01 23:00:00    5
2019-01-02 00:00:00   78
2019-01-02 01:00:00   41
2019-01-02 02:00:00   10
2019-01-02 03:00:00   10
2019-01-02 04:00:00   88
2019-01-02 05:00:00   19

这将是所需的输出:

                Dates  Age  flag
0  2019-01-01 00:00:00   29     1
1  2019-01-01 01:00:00   56     1
2  2019-01-01 02:00:00   82     1
3  2019-01-01 03:00:00   13     1
4  2019-01-01 04:00:00   35     1
5  2019-01-01 05:00:00   53     1
6  2019-01-01 06:00:00   25     1
7  2019-01-01 07:00:00   23     1
8  2019-01-01 08:00:00   21     1
9  2019-01-01 09:00:00   12     1
10 2019-01-01 10:00:00   15     1
11 2019-01-01 11:00:00    9     1
12 2019-01-01 12:00:00   13     1
13 2019-01-01 13:00:00   87     1
14 2019-01-01 14:00:00    9     1
15 2019-01-01 15:00:00   63     1
16 2019-01-01 16:00:00   62     1
17 2019-01-01 17:00:00   52     1
18 2019-01-01 18:00:00   43     1
19 2019-01-01 19:00:00   77     1
20 2019-01-01 20:00:00   95     1
21 2019-01-01 21:00:00   79     1
22 2019-01-01 22:00:00   77     1
23 2019-01-01 23:00:00    5     1
24 2019-01-02 00:00:00   78     0
25 2019-01-02 01:00:00   41     0
26 2019-01-02 02:00:00   10     0
27 2019-01-02 03:00:00   10     0
28 2019-01-02 04:00:00   88     0
29 2019-01-02 05:00:00   19     0

日期是数据帧的索引,递增 1 小时。谢谢

您可以先按Series.gt比较列,然后按DatetimeIndex.date分组,然后检查每组是否至少有一个TrueGroupBy.transformGroupBy.any ,最后将掩码转换为整数以进行True/False1/0映射,然后将其与之前的答案组合:

df = pd.DataFrame({'Age': 10}, index=pd.date_range('2019-01-01', freq='5H', periods=24))
#for test 1H timestamp use
#df = pd.DataFrame({'Age': 10}, index=pd.date_range('2019-01-01', freq='H', periods=24 * 5))
df.loc[pd.Timestamp('2019-01-02 01:00:00'), 'Age'] = 95
df.loc[pd.Timestamp('2019-01-03 02:00:00'), 'Age'] = 95
df.loc[pd.Timestamp('2019-01-05 19:00:00'), 'Age'] = 95
#print (df)
#for test 48 consecutive values change N = 48
N = 10
s = df['Age'].gt(90)
s1 = (s.groupby(df.index.date).transform('any')) 
g1 = s1.ne(s1.shift()).cumsum()
df['flag'] = (s.groupby(g1).transform('size').ge(N) & s1).astype(int)

print (df)
                     Age  flag
2019-01-01 00:00:00   10     0
2019-01-01 05:00:00   10     0
2019-01-01 10:00:00   10     0
2019-01-01 15:00:00   10     0
2019-01-01 20:00:00   10     0
2019-01-02 01:00:00   95     1
2019-01-02 06:00:00   10     1
2019-01-02 11:00:00   10     1
2019-01-02 16:00:00   10     1
2019-01-02 21:00:00   10     1
2019-01-03 02:00:00   95     1
2019-01-03 07:00:00   10     1
2019-01-03 12:00:00   10     1
2019-01-03 17:00:00   10     1
2019-01-03 22:00:00   10     1
2019-01-04 03:00:00   10     0
2019-01-04 08:00:00   10     0
2019-01-04 13:00:00   10     0
2019-01-04 18:00:00   10     0
2019-01-04 23:00:00   10     0
2019-01-05 04:00:00   10     0
2019-01-05 09:00:00   10     0
2019-01-05 14:00:00   10     0
2019-01-05 19:00:00   95     0

显然,这可能是问题的第一个版本的解决方案:如果至少一行具有相同日期 (y-m-d( 的 Age 值大于 90,如何添加行值为 1 的列。

import pandas as pd
df = pd.DataFrame({
     'Dates':['2019-01-01 00:00:00',
              '2019-01-01 01:00:00',
              '2019-01-01 02:00:00',
              '2019-01-02 00:00:00',
              '2019-01-02 01:00:00',
              '2019-01-03 02:00:00',
              '2019-01-03 03:00:00',],
     'Age':[29, 56, 92, 13, 1, 2, 93],})
df.set_index('Dates', inplace=True)
df.index = pd.to_datetime(df.index)
df['flag'] = pd.DatetimeIndex(df.index).day
df['flag'] = df.flag.isin(df['flag'][df['Age']>90]).astype(int)

它返回:

                    Age flag
Dates       
2019-01-01 00:00:00 29  1
2019-01-01 01:00:00 56  1
2019-01-01 02:00:00 92  1
2019-01-02 00:00:00 13  0
2019-01-02 01:00:00 1   0
2019-01-03 02:00:00 2   1
2019-01-03 03:00:00 93  1

最新更新