基于列条件创建列表

2024-05-16 19:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧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>;白炽灯。只使用其中一种(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>;白炽灯>;CFL。 对于index=2,我们有LED == 0,所以我们计算min(ceil(Reading/Incan_rating),Incan),因此读取列表是[0,0,2]

我的问题是: 有没有“熊猫/Python”的方法?我目前正在遍历每一行,并使用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

这是真的很慢,肯定感觉像一个糟糕的方式来编码。你知道吗


Tags: gtdfindexledminlistratingappend
1条回答
网友
1楼 · 发布于 2024-05-16 19:54:03

为了简单起见,我缩短了你的公式,但你应该用数据框应用(轴=1)

这将获取每一行和return and 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]

希望这有帮助

相关问题 更多 >