Новый столбец, основанный на логике двух других значений столбца, чтобы найти выброс - PullRequest
0 голосов
/ 10 ноября 2019

Есть ли способ применить логику к фрейму данных, основываясь на другом значении столбца:

I have DF:
Price    Upper_limit      Lower_Limit
10         9.5                 9
5           7                  6 

Также есть способ добавить столбец outlier, так что сравнение должно быть сделано для каждой строки?

if Price    < Lower_limit      or      Price    > Upper_limit      :    1
else: 0

Ожидаемый результат:

Price    Upper_limit      Lower_Limit    Outlier
10         9.5                 9            1
5           7                  6            0

Я пробовал с циклом и iloc[], но, похоже, не работает.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2019

Не могли бы вы попробовать следующее. Изменил мое решение в соответствии с @ rafaelc

df['outlier']=(df['Price'].gt(df['Upper_limit']) | df['Price'].lt(df['Lower_Limit'])).astype(int)

Вывод будет следующим.

    price   Upper_limit Lower_Limit outlier
0   10      9.5         9               1
1   5       6.0         7               0
0 голосов
/ 10 ноября 2019
outlier = []

static = []

for i in range(len(DF['obs_date'])):

    if DF['Upper_band'].iloc[i] < DF['price'].iloc[i] or DF['price'].iloc[i] < DF['Lower_band'].iloc[i]:

        outlier.append('1')

    else:

        outlier.append('0')    

    if DF['return'].iloc[i] == 0:

        static.append('1')

    else:

        static.append('0')


DF['outlier'] = outlier

DF['static'] = static

Это мое текущее [уродливое] решение, оно включает в себя логическое тестирование дополнительной статистики выбросов.

0 голосов
/ 10 ноября 2019

Как-то так должно работать:

for index, row in df.iterrows():
   df['Outlier'] = ~(row['Upper_limit'] <= row['Price'] <= row['Lower_limit']) * 1

print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...