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(以及之后的所有資料點),如果 cond. 是 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 的等價物)。
uj5u.com熱心網友回復:
您可以撰寫條件,然后分組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
uj5u.com熱心網友回復:
您可以通過將 Area 值與每個cond. 要創建布爾系列,我們首先必須將截止點映射到conds;并且因為 B 需要大于檢查而 A 需要小于檢查;我們必須反轉符號B以使兩個條件檢查朝著相同的方向。
然后使用groupby.cummax來獲得所需的指標:
mapping = {'A':1.5, 'B':-10}
area = df['Area'].mask(df['cond'].eq('B'), -df['Area'])
df['Indicator'] = df['cond'].map(mapping).ge(area).groupby(df['cond']).cummax().astype(int)
輸出:
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
uj5u.com熱心網友回復:
用于expanding查找之前的任何值是否符合您的條件:
condA = df["cond"].eq("A")&df["Area"].expanding().apply(lambda x: x.lt(1.5).any())
condB = df["cond"].eq("B")&df["Area"].expanding().apply(lambda x: x.gt(10).any())
df["Indicator"] = (condA|condB).astype(int)
>>> 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466675.html
標籤:Python 熊猫 数据框 熊猫-groupby
下一篇:將資料框列名和行值組合為單個字串
