import numpy as np import pandas as pd df = pd.DataFrame({ 'cond': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B','B', 'B', 'B', 'B', 'B','B','B'], 'Array': ['S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','S', 'S', 'TT', 'TT','SS','TT'], 'Area': [3.0, 2.0, 2.88, 1.33, 2.44, 1.25, 1.53, 1.0, 0.156, 2.0, 2.4, 6.3, 6.9, 9.78, 10.2, 3.0, 16.0, 19.0] }) print(df)
我正在尝试制作一个指示列,指示面积是否已经达到一定大小。例如,如果条件为 A,那么我想指示面积第一次 <=1.5(以及之后的所有数据点),如果条件为 B,那么我想指示面积第一次 >10(以及之后的所有点)。最终结果应如下所示:
cond Array Area Indicator 0 A S 3.000 0 1 A S 2.000 0 2 A TT 2.880 0 3 A TT 1.330 1 4 A S 2.440 1 5 A S 1.250 1 6 A TT 1.530 1 7 A TT 1.000 1 8 A S 0.156 1 9 B S 2.000 0 10 B TT 2.400 0 11 B TT 6.300 0 12 B S 6.900 0 13 B S 9.780 0 14 B TT 10.200 1 15 B TT 3.000 1 16 B SS 16.000 1 17 B TT 19.000 1
我看过的许多其他例子都是用来指示 A 的面积是否 <=1.5,或者指示第一次发生的时间,而不是指示第一次发生的时间并指示之后的所有数据点。这个想法是,一旦我的条件达到某个区域,它就会进入一个不同的“阶段”,我试图指示“A”何时进入并停留在该阶段(以及 B 的等价阶段)。
您可以编写条件,然后按 … 分组cond并使用cumsum+ clip:
cond
cumsum
clip
mask = (df['cond'].eq('A') & df['Area'].lt(1.5)) | (df['cond'].eq('B') & df['Area'].gt(10)) df['Indicator'] = mask.groupby(df['cond']).cumsum().clip(0, 1)
输出:
>>> df cond Array Area Indicator 0 A S 3.000 0 1 A S 2.000 0 2 A TT 2.880 0 3 A TT 1.330 1 4 A S 2.440 1 5 A S 1.250 1 6 A TT 1.530 1 7 A TT 1.000 1 8 A S 0.156 1 9 B S 2.000 0 10 B TT 2.400 0 11 B TT 6.300 0 12 B S 6.900 0 13 B S 9.780 0 14 B TT 10.200 1 15 B TT 3.000 1 16 B SS 16.000 1 17 B TT 19.000 1