python - 有什么办法可以改善这个循环吗?
问题描述
有一些输入,它们可以是列表中的字符串或无
如果输入与其各自的列匹配,我需要将 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 的方式,所以如果我需要检查另一个输入,我不必编写大量代码
解决方案
怎么样:
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”,并且实际上存在结果可能不同的情况(对于相等性的重载测试)。