我有一个数据帧列表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
这实在是太慢了,肯定感觉就像一个糟糕的方式实现代码。