蟒蛇。更新列表上的值匹配

时间:2019-10-05 14:53:22

标签: python

我有一列(row [“ MenuItemId”]),其中包含某些数字。如果该特定位置的值与另一个列表中的值匹配,则我希望创建一个新列。因此,我想创建一个具有值{45、46和47}的列表,并修改以下代码,并将其替换为列表名称:

  

这是我当前的代码

if row["MenuItemId"] == 45 or row["MenuItemId"] == 46 or row["MenuItemId"] == 47:
            DfOrders.loc[x,"beef"]= 1
else:
            DfOrders.loc[x,"beef"]= 0
  

预期输出


 MenuItemId   beef  
      45      1  
      55      0  
      46      1  
      46      1 

我如何更改当前代码,以便如果位置与列表中的任何项目匹配,则更新相应的值,而不是使用“或”语句手动指定数字:)

2 个答案:

答案 0 :(得分:0)

也许是这样:

allow = [45, 46, 47] # In this list are values, what determine condition. You can pretty good manipulate them :)

if row["MenuItemId"] in allow: # If <value> in <array> is standard for python.
            DfOrders.loc[x,"beef"]= 1
else:
            DfOrders.loc[x,"beef"]= 0

答案 1 :(得分:0)

如果要测试数字是否在整数的连续范围内,最好使用如下不等式表示:

if 45 <= row["MenuItemId"] <= 47:
            DfOrders.loc[x,"beef"] = 1
else:
            DfOrders.loc[x,"beef"] = 0

您甚至可以将其减少为一行,因为TrueFalse可以分别转换为10

DfOrders.loc[x,"beef"] = int(45 < = row["MenuItemId"] <= 47)

如果要测试的范围不是连续的,则可以将值放在列表中并测试列表的成员资格:

DfOrders.loc[x,"beef"] = int(row["MenuItemId"] in [45, 46, 47, 50])

但是,如果您要重新使用非连续范围,则将其一次定义为一组更有效。

beefy = set([45, 46, 47, 50])
DfOrders.loc[x,"beef"] = int(row["MenuItemId"] in beefy)

这是因为在最坏的情况下,在列表中查找元素所花费的时间与列表的大小成比例,但是无论集合的大小如何,在集合中查找元素所花费的时间都相同(从形式上来讲,列表的最坏情况下的查找是线性时间或O(n),其中n是列表的大小,但是设置的查找时间是恒定时间,或者O(1))。

如果您的代码只使用一次范围,则最好也使用列表,因为Python必须通读每个元素才能进行设置。

相关问题