簡體   English   中英

Pandas 在條件下添加列:如果單元格的值為 True,則將 Period 中最大數字的值設置為 true

[英]Pandas add column on condition: If value of cell is True set value of largest number in Period to true

我有一個 Pandas 數據框,可以說兩列,例如:

     value  boolean
0        1        0
1        5        1
2        0        0
3        3        0
4        9        1
5       12        0
6        4        0
7        7        1
8        8        1
9        2        0
10      17        0
11      15        1
12       6        0

現在我想添加具有以下條件的第三列 (new_boolean):我指定一個句點,對於此示例,句點 = 4。現在我查看所有布爾值 == 1 的行。對於最大值,new_boolean 將為 1在最后一期行中。

例如,我的第 2 行有 boolean == 1。所以我查看最后一期的行。 值為 [1, 5],5 是最大值,因此第 2 行中 new_boolean 的值為 1。

第二個示例:第 8 行(值 = 7):我得到值 [7, 4, 12, 9],12 是最大值,因此值為 12 的行中 new_boolean 的值將為 1

結果:

     value   boolean  new_boolean
0        1         0            0
1        5         1            1
2        0         0            0
3        3         0            0
4        9         1            1
5       12         0            1
6        4         0            0
7        7         1            0
8        8         1            0
9        2         0            0
10      17         0            1
11      15         1            0
12       6         0            0

在此處輸入圖片說明

我怎樣才能在算法上做到這一點?

df.indexdf.ilocdf.idxmax

In [182]: period = 4 # Define period to 4
In [183]: ix = df[df.boolean.eq(1)].index # Create a list of indexes where boolean = 1

In [213]: new_bool_ix = [] # empty list

# For every index in `ix`, take the last 4 rows and append the index of maximum `value`
In [215]: for i in ix:
     ...:     new_bool_ix.append(df.iloc[:i + 1].iloc[-period:]['value'].idxmax()) 
     ...:  

In [225]: df['new_boolean'] = 0 # declare column new_boolean with default value `0`
In [227]: df.loc[new_bool_ix, 'new_boolean'] = 1 # Change the value to 1 for the indexes in new_bool_ix

In [228]: df
Out[228]: 
    value  boolean  new_boolean
0       1        0            0
1       5        1            1
2       0        0            0
3       3        0            0
4       9        1            1
5      12        0            1
6       4        0            0
7       7        1            0
8       8        1            0
9       2        0            0
10     17        0            1
11     15        1            0
12      6        0            0

計算“值”列的滾動最大值

>>> rolling_max_value = df.rolling(window=4, min_periods=1)['value'].max()
>>> rolling_max_value 

0      1.0
1      5.0
2      5.0
3      5.0
4      9.0
5     12.0
6     12.0
7     12.0
8     12.0
9      8.0
10    17.0
11    17.0
12    17.0
Name: value, dtype: float64

僅選擇相關值,即其中 'boolean' = 1

>>> on_values = rolling_max_value[df.boolean == 1].unique()
>>> on_values

array([ 5.,  9., 12., 17.])

'new_boolean' = 1 的行是 'value' 屬於on_values

>>> df['new_boolean'] = df.value.isin(on_values).astype(int)
>>> df

    value  boolean  new_boolean
0       1        0            0
1       5        1            1
2       0        0            0
3       3        0            0
4       9        1            1
5      12        0            1
6       4        0            0
7       7        1            0
8       8        1            0
9       2        0            0
10     17        0            1
11     15        1            0
12      6        0            0

我分兩步完成,但我認為解決方案更清晰:

df = pd.read_csv(StringIO('''
id value  boolean
0        1        0
1        5        1
2        0        0
3        3        0
4        9        1
5       12        0
6        4        0
7        7        1
8        8        1
9        2        0
10      17        0
11      15        1
12       6        0'''),delim_whitespace=True,index_col=0)

df['new_bool'] = df['value'].rolling(min_periods=1, window=4).max()
df['new_bool'] = df.apply(lambda x: 1 if ((x['value'] == x['new_bool']) & (x['boolean'] == 1)) else 0, axis=1)
df

結果:

    value   boolean new_bool
id          
0   1   0   0
1   5   1   1
2   0   0   0
3   3   0   0
4   9   1   1
5   12  0   0
6   4   0   0
7   7   1   0
8   8   1   0
9   2   0   0
10  17  0   0
11  15  1   0
12  6   0   0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM