创建基于列的条件
问题描述:
我有一个数据帧列表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
这实在是太慢了,肯定感觉就像一个糟糕的方式实现代码。
答
我缩短您的公式简单起见,但你应该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]
希望这有助于