在同一天内根据条件识别细胞

时间:2019-04-09 10:51:37

标签: python pandas

假设我具有以下数据框。如果一天的年龄大于90并且仅连续2天(在这种情况下为48小时)发生,我该怎么做才能获得带有1的额外列“标志”?根据满足条件的天数,输出应在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

日期是数据帧的索引,并增加1h。 谢谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

显然,这可能是该问题的第一个版本的解决方案:如果至少一个具有相同日期(ymd)的行的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