【问题标题】:Python: Print count of several statements using a for loopPython:使用 for 循环打印多个语句的计数
【发布时间】:2021-09-27 11:11:44
【问题描述】:

我想知道 Python 中是否有一种“when 语句”。例如,在下面的代码中,在某些时候所有观察结果都是正确的。我写它的方式,只读取第一个语句而忽略其他 2。我怎样才能使它在特定条件下打印所有观察的计数?

counts_zero_time = 0
counts_zero_time_non_zero_dist = 0
counts_zero_time_zero_dist = 0

for index,row in df.iterrows():
    
    if row["time_interval"] == 0:
        counts_zero_time += 1
        
    elif row["time_interval"] == 0 and row["distance"] !=0:
        counts_zero_time_non_zero_dist += 1
    
    elif row["time_interval"] == 0 and row["distance"] ==0:
        counts_zero_time_zero_dist += 1
        
print(counts_zero_time, "observations have a time interval of 0")
print(counts_zero_time_non_zero_dist, "observations have a time interval of 0 and a non-zero distance")
print(counts_zero_time_zero_dist, "observations have a time interval and distance of 0")

在输出中,我得到第一个条件的正确计数,但其他两个不正确的计数为零。

1421 observations have a time interval of 0
0 observations have a time interval of 0 and a non-zero distance
0 observations have a time interval and distance of 0

【问题讨论】:

  • 您可以将elif 替换为if。但更好的方法是使用 pandas 表达式。那么你不需要遍历数据框
  • 您的意思是添加单独的行来打印计数吗?像这样 zero_interval = trip_char.loc[(df["time_interval"] == 0)] 然后打印它的长度?
  • 是的,类似的。请看我的回答

标签: python for-loop if-statement count conditional-statements


【解决方案1】:

根据您的逻辑,您可以像这样使用独立的if 语句:

for index, row in df.iterrows():
    if row["time_interval"] == 0:
        counts_zero_time += 1
        
    if row["time_interval"] == 0 and row["distance"] != 0:
        counts_zero_time_non_zero_dist += 1
    
    if row["time_interval"] == 0 and row["distance"] == 0:
        counts_zero_time_zero_dist += 1

或者,您可以将第二个和第三个 elif 语句嵌套在第一个语句中,如下所示:

for index, row in df.iterrows():
    if row["time_interval"] == 0:
        counts_zero_time += 1
        
        if row["distance"] != 0:
            counts_zero_time_non_zero_dist += 1
        else:
            counts_zero_time_zero_dist += 1

【讨论】:

    【解决方案2】:

    您可以使用 pandas 操作来避免对数据框进行迭代。对数据框进行迭代是 pandas 中的一种反模式。

    您可以使用boolean masking 找出哪些样本符合您的条件。然后您可以对该数据框进行求和,这将告诉您有多少样本匹配。

    time_interval_is_zero = df.loc[:, "time_interval"] == 0
    distance_is_zero = df.loc[:, "distance"] == 0
    
    counts_zero_time = time_interval_is_zero.sum()
    counts_zero_time_zero_dist = (time_interval_is_zero & distance_is_zero).sum()
    counts_zero_time_non_zero_dist = (time_interval_is_zero & ~distance_is_zero).sum()
    

    ~ 反转布尔值,因此 True 变为 False 并且反之亦然& 为每对行计算 and


    关于您的原始实现,如果之前的 elifif 语句是 True,则不会到达后面的 elif 语句。要评估所有条件,您应该将它们全部设为 if 语句。

    【讨论】:

      【解决方案3】:

      使用 if/elif 的条件语句在第一个 True 语句处终止。考虑一下这个sn-p

      if True:
          print('a')
      elif True and True:
          print('b')
      elif True and True:
          print('c')
      

      只有字符“a”会被打印,因为第一个语句是 True。然而,在下一个 sn-p 中,“a”、“b”和“c”都将被打印出来,因为每个条件都是独立于其他条件进行评估的。

      if True:
          print('a')
      if True and True:
          print('b')
      if True and True:
          print('c')
      

      要修复代码中的错误,您必须独立评估每个条件,例如

      if row["time_interval"] == 0:
          counts_zero_time += 1     
      if row["time_interval"] == 0 and row["distance"] !=0:
          counts_zero_time_non_zero_dist += 1
      if row["time_interval"] == 0 and row["distance"] ==0:
          counts_zero_time_zero_dist += 1
      

      【讨论】:

        【解决方案4】:

        更改 if/elif 语句的顺序。将row['time_interval'] == 0 放在最后一个位置。像这样的:

        for index,row in df.iterrows():
            if row["time_interval"] == 0 and row["distance"] !=0:
                counts_zero_time_non_zero_dist += 1
            elif row["time_interval"] == 0 and row["distance"] ==0:
                counts_zero_time_zero_dist += 1
            if row["time_interval"] == 0:
                counts_zero_time += 1
            
        

        【讨论】:

          猜你喜欢
          • 2020-06-18
          • 1970-01-01
          • 2017-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多