Улучшить читаемость программы для логики в нескольких столбцах панд - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно применить некоторую логику к нескольким столбцам, но все, что я мог сделать, это просто написать это по одному (и это не так, как в Python).

import numpy as np
import pandas as pd

data = {
    'Ticker':['S&P','Kospi','FTSE','DAX','Topix'],
    'P/E_Cur':[26,21,16,14,23],
    'P/E_lag_1yr':[22,14,28,31,18],
    'P/E_lag_2yr':[17,11,13,np.NaN,10],
    'P/E_lag_3yr':[np.NaN,np.NaN,12,14,15]
}

df = pd.DataFrame(data)

Текущий P / E находится на максимуме за 4 года, и текущее значение увеличилось более чем на 10% за последние 3 года.Если какое-либо из этих условий выполнено, Flag будет 1 или 0. Но если какое-либо поле столбца имеет значение Null, то flag также должно быть равно Null.Все, что я мог написать, - это вручную написать весь код

c1 = df['P/E_Cur'].notnull() 
c2 = df['P/E_lag_1yr'].notnull()  
c3 = df['P/E_lag_2yr'].notnull() 
c4 = df['P/E_lag_3yr'].notnull()

c5 = df['P/E_Cur']>df['P/E_lag_1yr']
c6 = df['P/E_Cur']>df['P/E_lag_2yr']
c7 = df['P/E_Cur']>df['P/E_lag_3yr'] 
c8 = (df['P/E_Cur']/df['P/E_lag_3yr']-1)>0.1

df['P/E_flag'] = np.where(c1&c2&c3&c4,np.where(c5&c6&c7&c8,1,0), np.NaN)

Я хочу написать всю эту логику на python (умном) пути.

1 Ответ

0 голосов
/ 07 июня 2018

Вот моя попытка с использованием pd.DataFrame.all и pd.DataFrame.max.Установка axis=1 гарантирует, что мы агрегируем по столбцам или по строкам .

mask1 = df[['P/E_Cur', 'P/E_lag_1yr', 'P/E_lag_2yr', 'P/E_lag_3yr']].notnull().all(1)

mask2 = df['P/E_Cur'] > df[['P/E_lag_1yr', 'P/E_lag_2yr', 'P/E_lag_3yr']].max(1)

mask3 = (df['P/E_Cur'] / df['P/E_lag_3yr'] - 1) > 0.1

df['P/E_flag'] = np.where(mask1, np.where(mask2 & mask3, 1, 0), np.nan)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...