2017-02-21 7 views
1

У меня есть DataFrame под названием ES_15M_Summary с коэффициентами/бет в на колонке под названием ES_15M_Summary [ «Rolling_OLS_Coefficient»] следующим образом:Python DataFrames For Loop с Если заявление не работает

Column 'Rolling_OLS_Coefficient'

Если выше изображен столбец («Rolling_OLS_Coefficient») - это значение больше 0,8, я хочу, чтобы новый столбец «Long» был двоичным «Y». Если значение в другом столбце меньше 0,8, я хочу, чтобы это значение было «NaN» или просто «N» (либо работает).

Итак, я пишу цикл for, чтобы запустить столбцы. Во-первых, я создал новый столбец 'Long' и установите его значение NaN:

ES_15M_Summary['Long'] = np.nan 

Тогда я сделал следующее For Loop:

for index, row in ES_15M_Summary.iterrows(): 
    if ES_15M_Summary['Rolling_OLS_Coefficient'] > .08: 
     ES_15M_Summary['Long'] = 'Y' 
    else: 
     ES_15M_Summary['Long'] = 'NaN' 

Я получаю ошибку:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

... ссылаясь на строку оператора if, показанную выше (если ...>. 08 :). Я не уверен, почему я получаю эту ошибку или что не так с циклом for. Любая помощь приветствуется.

ответ

2

Я думаю, что лучше использовать numpy.where:

mask = ES_15M_Summary['Rolling_OLS_Coefficient'] > .08 
ES_15M_Summary['Long'] = np.where(mask, 'Y', 'N') 

Пример:

ES_15M_Summary = pd.DataFrame({'Rolling_OLS_Coefficient':[0.07,0.01,0.09]}) 
print (ES_15M_Summary) 
    Rolling_OLS_Coefficient 
0      0.07 
1      0.01 
2      0.09 

mask = ES_15M_Summary['Rolling_OLS_Coefficient'] > .08 
ES_15M_Summary['Long'] = np.where(mask, 'Y', 'N') 
print (ES_15M_Summary) 
    Rolling_OLS_Coefficient Long 
0      0.07 N 
1      0.01 N 
2      0.09 Y 

Looping, очень медленное решение:

for index, row in ES_15M_Summary.iterrows(): 
    if ES_15M_Summary.loc[index, 'Rolling_OLS_Coefficient'] > .08: 
     ES_15M_Summary.loc[index,'Long'] = 'Y' 
    else: 
     ES_15M_Summary.loc[index,'Long'] = 'N' 
print (ES_15M_Summary) 
    Rolling_OLS_Coefficient Long 
0      0.07 N 
1      0.01 N 
2      0.09 Y 

Timings:

#3000 rows 
ES_15M_Summary = pd.DataFrame({'Rolling_OLS_Coefficient':[0.07,0.01,0.09] * 1000}) 
#print (ES_15M_Summary) 


def loop(df): 
    for index, row in ES_15M_Summary.iterrows(): 
     if ES_15M_Summary.loc[index, 'Rolling_OLS_Coefficient'] > .08: 
      ES_15M_Summary.loc[index,'Long'] = 'Y' 
     else: 
      ES_15M_Summary.loc[index,'Long'] = 'N' 
    return (ES_15M_Summary) 

print (loop(ES_15M_Summary)) 


In [51]: %timeit (loop(ES_15M_Summary)) 
1 loop, best of 3: 2.38 s per loop 

In [52]: %timeit ES_15M_Summary['Long'] = np.where(ES_15M_Summary['Rolling_OLS_Coefficient'] > .08, 'Y', 'N') 
1000 loops, best of 3: 555 µs per loop 
+0

Спасибо, я использую цикл for, который вы предоставили. Очень признателен. –