Условие, основанное на ffil () в пандах Dataframe - PullRequest
0 голосов
/ 24 мая 2018

Я задал похожий вопрос и получил некоторую помощь, но после дополнительного тестирования решение не сработало.Я не уверен, как открыть существующий билет, поэтому я спрошу снова.У меня есть фрейм данных, и я пытаюсь заполнить столбец на основе условия, но не могу заставить его работать правильно в каждом случае.

Я хочу, чтобы 1 вставлялся в тестовый столбец, если в столбце IN есть 1, а в столбце 200D - 1. Но как только столбец 200D переходит в 0, столбец TEST не должен возвращаться к1, пока не будет 1 в столбце IN.Это тестовый пример DF и код, который у меня есть до сих пор

df['TEST']=df.loc[df.IN==1,'IN'] 
df['TEST'] = df.loc[df['200D_MA']==1,'TEST'].ffill()
df['TEST'].fillna(0,inplace=True)

        Date       IN   200D    TEST    
        12/6/2013   0     1      0  
        12/9/2013   0     1      0  
        12/10/2013  1     1      1  IN and 200D 1 >> TEST =1
        12/11/2013  0     1      1  1 to Carry Down as long as 200D =1
        12/16/2013  0     1      1  Carry Down as long as 200D =1
        12/17/2013  0     1      1  
        12/18/2013  0     0      0  TEST = 0 bc 200D =0
        12/19/2013  0     0      0  
        12/20/2013  0     0      0  
        12/23/2013  0     1      1  WRONG > TEST SHOULD BE 0 bc IN not 1
        12/24/2013  0     1      1  WRONG > TEST SHOULD BE 0 bc IN not 1
        12/25/2013  0     1      1  WRONG > TEST SHOULD BE 0 bc IN not 1
        12/26/2013  1     0      0  
        12/27/2013  1     0      0  
        12/28/2013  0     1      1  
        12/29/2013  1     1      1  IN and 200D 1 >> TEST =1
        12/30/2013  0     1      1  
        12/31/2013  0     1      1  
        1/1/2014    0     0      0  
        1/2/2014    1     0      0  TEST=1 but 200D =0 >> TEST =0
        1/3/2014    0     0      0  
        1/6/2014    0     0      0  
        1/7/2014    1     1      1  IN and 200D 1 >> TEST =1
        1/8/2014    0     1      1  

1 Ответ

0 голосов
/ 24 мая 2018

Я решил ваш запрос, используя numpy, посмотрите

import pandas as pd
import numpy as np

df = pd.DataFrame({'Date': ['12-06-2013', '12-09-2013', '12-10-2013', '12-11-2013', '12/16/2013',
                            '12/17/2013', '12/18/2013', '12/19/2013', '12/20/2013', '12/23/2013',
                            '12/24/2013', '12/25/2013', '12/26/2013', '12/27/2013', '12/28/2013',
                            '12/29/2013', '12/30/2013', '12/31/2013', '01-01-2014', '01-02-2014',
                            '01-03-2014', '01-06-2014', '01-07-2014', '01-08-2014'],
                   'IN': [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
                   '200D': [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1]})

df = df[['Date', 'IN', '200D']]

df['TEST'] = np.where((df['IN'] == 1) | (df['200D'] == 1), 1, 0)

print(df)

, и результат будет выглядеть так, как вы просили

          Date  IN  200D  TEST
0   12-06-2013   0     1     1
1   12-09-2013   0     1     1
2   12-10-2013   1     1     1
3   12-11-2013   0     1     1
4   12/16/2013   0     1     1
5   12/17/2013   0     1     1
6   12/18/2013   0     0     0
7   12/19/2013   0     0     0
8   12/20/2013   0     0     0
9   12/23/2013   0     1     1
10  12/24/2013   0     1     1
11  12/25/2013   0     1     1
12  12/26/2013   1     0     1
13  12/27/2013   1     0     1
14  12/28/2013   0     1     1
15  12/29/2013   1     1     1
16  12/30/2013   0     1     1
17  12/31/2013   0     1     1
18  01-01-2014   0     0     0
19  01-02-2014   1     0     1
20  01-03-2014   0     0     0
21  01-06-2014   0     0     0
22  01-07-2014   1     1     1
23  01-08-2014   0     1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...