2016-11-06 82 views
1

我正在處理一個大的多指數數據框results_matrix與幾列。我需要訪問Results1Results2列的每個元素,並根據存儲在DataFrame的列Indicator中的指示符變量選擇其中一個元素。大熊貓 - 有效的元素比較

目前,我正在訪問for循環中的每個元素 - 但是,這會增加程序的計算時間。 有沒有辦法更有效地做到這一點?

import pandas as pd 
import numpy as np 

selected_results = pd.Series(np.nan) 
# Used to iterate through the rows of the DataFrame 
i = 0 
for items in results_matrix['Indicator']: 
    if results_matrix.iloc[i]['Indicator'] == 1: 
     selected_results[i] = results_matrix.iloc[i]['Results1'] 
    else: 
     selected_results[i] = results_matrix.iloc[i]['Results2'] 
    i += 1 

results_matrix['SelectedResults'] = selected_results.values 

回答

2

我想你需要numpy.where

results_matrix['SelectedResults'] = np.where(results_matrix['Indicator'] == 1, 
              results_matrix['Results1'], 
              results_matrix['Results2']) 

樣品:

results_matrix = pd.DataFrame({'Indicator':[1,2,3], 
           'Results1':[4,5,6], 
           'Results2':[7,8,9]}) 

print (results_matrix) 
    Indicator Results1 Results2 
0   1   4   7 
1   2   5   8 
2   3   6   9 

results_matrix['SelectedResults'] = np.where(results_matrix['Indicator'] == 1, 
              results_matrix['Results1'], 
              results_matrix['Results2']) 

print (results_matrix)            
    Indicator Results1 Results2 SelectedResults 
0   1   4   7    4 
1   2   5   8    8 
2   3   6   9    9 
+0

@jezreal,非常感謝!這正是我所期待的。現在,我可以爲/ if/elif/else組合刪除其他一些。 – Andreas