2016-09-26 6 views
1

カラム条件に基づいてリストを作成するdf私は"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] 

各値内用listsを含む2つの以上の列、"Hall"用と別のものを作成したい

>>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 

リストは次のように入力されます。

cfl_rating = 50 
led_rating = 100 
incan_rating = 25 

Hall_Listの場合:

CFL> LED> Incanが優先されます。それらのうちの1つだけが使用されます(CFLまたはLEDまたはIncan)。

まず、CFL != 0がある場合は、Trueと計算され、min(ceil(Hall/CFL_rating),CFL)と計算されます。 index=0の場合、これは2と評価されます。したがって、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

(軸= 1)

これは、すべての行を取得して返すとndarray、その後、あなたはそのようなものがあり、好きな機能を適用することができ、私は単純化のために、あなたの数式を短くするが、あなたはdf.apply使用する必要があります。

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] 

が、これは

を役に立てば幸い
関連する問題