2016-09-26 73 views
1

我有一個數據幀列表df創建基於列的條件

>>df 
    LED CFL Incan Hall Reading 
0 3 2 1  100 150 
1 2 3 1  150 100 
2 0 1 3  200 150 
3 1 2 4  300 250 
4 3 3 1  170 100 

我要創建兩個列包含lists,一個用於"Hall",另一個用於"Reading"

>>df_output 
    LED CFL Incan Hall Reading Hall_List Reading_List 
0 3 2 1  100 150  [0,2,0] [2,0,0] 
1 2 3 1  150 100  [0,3,0] [2,0,0] 
2 0 1 3  200 150  [0,1,0] [0,0,2] 
3 1 2 4  300 250  [0,2,0] [1,0,0] 
4 3 3 1  100 100  [0,2,0] [2,0,0] 

中的每個值該列表填充如下:

cfl_rating = 50 
led_rating = 100 
incan_rating = 25 

對於Hall_List

首選是CFL> LED> Incan。只有其中一個將被使用(CFL或LED或印加)。

我們首先檢查CFL != 0,如果True那麼我們計算min(ceil(Hall/CFL_rating),CFL)。對於index=0這個評估爲2.因此我們有[0,2,0],而對於index=2我們有[0,1,0]。

Reading_List類似,首選項是LED> Incan> CFL。 爲index=2,我們有LED == 0,所以我們計算min(ceil(Reading/Incan_rating),Incan)因此Reading_List是[0,0,2]

我的問題是: 是否有一個「熊貓/ pythony路」這樣的?我目前正在遍歷每一行,並使用if-elif-else條件來分配值。

我的代碼片段看起來是這樣的:

#Hall_List 
for i in range(df.shape[0]): 
    Hall = [] 
    if (df['CFL'].iloc[i] != 0): 
     Hall.append(0) 
     Hall.append(min((math.ceil(df['Hall'].iloc[i]/cfl_rating)),df['CFL'].iloc[i])) 
     Hall.append(0) 

    elif (df['LED'].iloc[i] != 0): 
     Hall.append(min((math.ceil(df['Hall'].iloc[i]/led_rating)),df['LED'].iloc[i])) 
     Hall.append(0) 
     Hall.append(0) 

    else: 
     Hall.append(0) 
     Hall.append(0) 
     Hall.append(min((math.ceil(df['Hall'].iloc[i]/incan_rating)),df['Incan'].iloc[i])) 

    df['Hall_List'].iloc[i] = Hall 

這實在是太慢了,肯定感覺就像一個糟糕的方式實現代碼。

回答

0

我縮短您的公式簡單起見,但你應該df.apply使用(軸= 1)

這需要每一行,返回和ndarray,那麼你可以申請任何功能,你想這樣有:

df = pd.DataFrame([[3, 2, 1, 100, 150], [2, 3, 1, 150, 100]], columns=['LED', 'CFL', 'Incan', 'Hall', 'Reading']) 

def create_list(ndarray): 
    if ndarray[1] != 0: 
     result = [0, ndarray[1], 0] 
    else: 
     result = [ndarray[2], 0, 0] 
    return result 

df['Hall_List'] = df.apply(lambda x: create_list(x), axis=1) 

只需將功能更改爲任何您喜歡的功能即可。

In[49]: df 
Out[49]: 
    LED CFL Incan Hall Reading Hall_List 
0 3 2  1 100  150 [0, 2, 0] 
1 2 3  1 150  100 [0, 3, 0] 

希望這有助於