我有一個數據幀列表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
這實在是太慢了,肯定感覺就像一個糟糕的方式實現代碼。