如何在python中查找值大于0时记录的事件或脉冲的数量?

问题描述 投票:0回答:1

我有一个数据集,代表一天中每小时的降雨量。我正在创建列“E1”,该列应从零开始,并在每次“值”列大于零时递增,并在“值”列再次变为零时停止,同样,当“值”列为零时,编号必须继续。

condition = ((df['value'] > 0) & (df['value'].shift(periods=1) == 0))

df['E2'] = (condition).cumsum()
print(df)
    hour  value  E2
0      0    0.0   0
1      1    0.2   1
2      2    0.2   1
3      3    0.2   1
4      4    0.0   1
5      5    0.2   2
6      6    0.2   2
7      7    0.0   2
8      8    NaN   2
9      9    0.2   2
10    10    0.0   2
11    11    0.0   2
12    12    0.2   3
13    13    0.2   3
14    14    0.0   3
15    15    NaN   3
16    16    0.2   3
17    17    0.0   3
18    18    0.2   4
19    19    0.0   4
20    20    0.2   5
21    21    0.2   5
22    22    NaN   5
23    23    0.0   5

E1代表事件编号,一个事件可以持续1或几个小时,只有当事件开始之前的单元格为零且最后一个数据之后的单元格等于0时才应考虑事件

我陷入困境,试图列出事件。应该得到:

    hour  value  E2
0      0    0.0   0
1      1    0.2   1
2      2    0.2   1
3      3    0.2   1
4      4    0.0   0
5      5    0.2   2
6      6    0.2   2
7      7    0.0   0
8      8    NaN   0
9      9    0.2   0
10    10    0.0   0
11    11    0.0   0
12    12    0.2   3
13    13    0.2   3
14    14    0.0   0
15    15    NaN   0
16    16    0.2   0
17    17    0.0   0
18    18    0.2   4
19    19    0.0   0
20    20    0.2   0
21    21    0.2   0
22    22    NaN   0
23    23    0.0   0
python pandas numpy enumerate cumsum
1个回答
0
投票

我发现这是一个奇怪的标准,但以下是如何计算“事件”数字。因为您要向前和向后看,所以无法以矢量化方式做到这一点。

import numpy as np
import pandas as pd

data = [
  0.0,
  0.2,
  0.2,
  0.2,
  0.0,
  0.2,
  0.2,
  0.0,
  np.nan,
  0.2,
  0.0,
  0.0,
  0.2,
  0.2,
  0.0,
  np.nan,
  0.2,
  0.0,
  0.2,
  0.0,
  0.2,
  0.2,
  np.nan,
  0.0
]

data = [[k] for k in data]
df = pd.DataFrame( data, columns=['data'])
print(df)

nxt = 1
nums = np.zeros(len(df['data']), dtype=int)
start = None
for ndx,v in enumerate(df['data']):
    if np.isnan(v):
        start = None
    elif not v:
        if start is not None and start < ndx:
            nums[start:ndx] = nxt
            nxt += 1
        start = ndx+1

df['E1'] = nums
print(df)

输出:

    data
0    0.0
1    0.2
2    0.2
3    0.2
4    0.0
5    0.2
6    0.2
7    0.0
8    NaN
9    0.2
10   0.0
11   0.0
12   0.2
13   0.2
14   0.0
15   NaN
16   0.2
17   0.0
18   0.2
19   0.0
20   0.2
21   0.2
22   NaN
23   0.0
    data  E1
0    0.0   0
1    0.2   1
2    0.2   1
3    0.2   1
4    0.0   0
5    0.2   2
6    0.2   2
7    0.0   0
8    NaN   0
9    0.2   0
10   0.0   0
11   0.0   0
12   0.2   3
13   0.2   3
14   0.0   0
15   NaN   0
16   0.2   0
17   0.0   0
18   0.2   4
19   0.0   0
20   0.2   0
21   0.2   0
22   NaN   0
23   0.0   0
© www.soinside.com 2019 - 2024. All rights reserved.