首页 > 解决方案 > 有什么办法可以改善这个循环吗?

问题描述

有一些输入,它们可以是列表中的字符串或无

如果输入与其各自的列匹配,我需要将 df.col_2 添加到 df.col_1

IE:

if df.INPUT_1.iloc[0] in input_1:
        df.col_1.iloc[0] = df.col_1.iloc[0] + df.col_2.iloc[0]

我有以下代码可以为两个输入完成工作:

if input_1 == None and input_2 == None:
    for i in range(len(df)):
        df.col_1.iloc[i] = df.col_1.iloc[i] + df.col_2.iloc[i]
elif input_1 != None and input_2 == None:
    for i in range(len(df)):
        if (df.INPUT_1.iloc[i] in input_1):
            df.col_1.iloc[i] = df.col_1.iloc[i] + df.col_2.iloc[i]
elif input_1 == None and input_2 != None:
    for i in range(len(df)):
        if (df.INPUT_2.iloc[i] in input_2):
            df.col_1.iloc[i] = df.col_1.iloc[i] + df.col_2.iloc[i]
elif input_1 != None and input_2 != None:
    for i in range(len(df)):
        if (df.INPUT_1.iloc[i] in input_1) and (df.INPUT_2.iloc[i] in input_2):
            df.col_1.iloc[i] = df.col_1.iloc[i] + df.col_2.iloc[i]

但我追求的是一种更 Python 的方式,所以如果我需要检查另一个输入,我不必编写大量代码

标签: pythondataframeloops

解决方案


怎么样:

for i in range(len(df)):
    if ((not input_1 or df.INPUT_1.iloc[i] in input_1) and 
        (not input_2 or df.INPUT_2.iloc[i] in input_2)):
        df.col_1.iloc[i] += df.col_2.iloc[i]

因此,反转使得for循环是外部结构,然后为每个值单独测试不同的约束。根据数据的不同,它可能效率较低,但可能更容易掌握。

编辑:

或与原始代码保持一致:

for i in range(len(df)):
    if ((input_1 is not None or df.INPUT_1.iloc[i] in input_1) and 
        (input_2 is not None or df.INPUT_2.iloc[i] in input_2)):
        df.col_1.iloc[i] += df.col_2.iloc[i]

正如下面@MoritzVetter 所指出的,我未编辑的答案对空列表的处理方式与原始代码不同。我提出的解决方案将忽略空列表,而原始代码将假定它们是要在其中查找输入的列表。我做出这个选择的原因是因为我相信这是原始代码的意图,但我当然不确定这一点。

如果空列表被认为是有效的,则应注意,正如评论中所做的那样,比较 with 的更好方法None是使用var is not None而不是var != None. 这可能是一个小问题,但它使代码更加“Pythonic”,并且实际上存在结果可能不同的情况(对于相等性的重载测试)。


推荐阅读