【问题标题】:How can I loop through an index and keep the associated row information?如何遍历索引并保留关联的行信息?
【发布时间】:2018-07-01 06:58:46
【问题描述】:

我的函数中有一个循环,它应该找到最大速率、最小速率并计算平均值,而我编写的函数这样做是正确的,但是当我找到我的数据中的最大值和最小值?我是python的初学者,但这是我拥有的循环。

    max_rate = -1 
    min_rate = 25 
    count = 0 
    sum = 0
    with open(file_names, "r") as file_out:
   # skips the headers in the file
      next(file_out)
      for line in file_out: 
         values = line.split(",")
 # since rate is index 6 that is what we are going to compare to values above
        if float(values[6]) > max_rate: 
           max_rate = float(values[6])
        if float(values[6]) < min_rate:
           min_rate = float(values[6])
     count += 1
  # sum up all rates in the rates column
     sum = float(values[6]) + sum 
     avg_rate = sum / count
     print(avg_rate)

我打印了平均值只是为了测试我的功能。希望我问的问题是有道理的,我不只是想要第 6 个索引,而是想要具有最小值或最大值的其余行信息。一个示例是获取公司名称、州、邮编和费率。不要担心缩进,我不知道我是否在此处的代码块中将其格式化,但所有缩进都在我的代码块中。

【问题讨论】:

  • maxminkey 函数一起使用。 max(lines, key=lambda x: x[6])
  • for i, line in enumerate(file_out): 为您提供行号和行内容。然后您可以更新line_maxline_min 计数器以及您的费率。顺便说一句,如果您的数据集中的最大值/最小值不止一次,那么输出应该是什么?
  • 非常感谢,对于您的回复,我还有一个后续问题,说我不想要所有行信息,但仍然想要该行中的一些片段,这仍然有效吗,或者我应该以不同的方式去做吗?
  • 为了回答你的问题,输出应该取它遇到的第一个最大值或第一个最小值(如果重复最大值或最小值)。
  • 枚举方法的优点是,在循环结束时,您的计数为i + 1。但是你当然也可以运行一个单独的变量,比如count。你的代码。

标签: python arrays list for-loop indexing


【解决方案1】:

您似乎正在处理 CSV 或其他类似表格的数据。 Pandas 处理得非常好。一个例子是:

import pandas as pd

df = pd.read_csv('something.csv')
print(df)

print(f'\nMax Rate: {df.rate.max()}')
print(f'Avg Rate: {df.rate.mean()}')
print(f'Min Rate: {df.rate.min()}')
print(f'Last Company (Alphabetically): {df.company_name.max()}')

产量:

    company_name         state    zip    rate
0  Company1 Inc.         Texas  76189  0.6527
1  Company2 LLC.  Pennsylvania  18657  0.7265
2  Company3 Corp       Indiana  47935  0.5267

Max Rate: 0.7265
Avg Rate: 0.6353
Min Rate: 0.5267
Last Company (Alphabetically): Company3 Corp

【讨论】:

    【解决方案2】:

    这些建议很棒。谢谢,我还发现我也可以将该行分配给 if 语句下方的变量。然后在我的函数开始时,我可以将这个变量分配给一个空字符串。喜欢

    info_high = ""
    info_low = ""
    info_high = line 
    info_low = line 
    

    它将能够保存我需要的行信息,然后我只需索引我需要的信息。

    【讨论】:

    • 为什么这不是一个答案,它正在保存行信息并找到最大/最小。
    • 啊,我明白你在这里做什么了。最好删除“那些建议很棒”并将您的答案格式化为更易于阅读的内容。当其他人偶然发现类似问题时,此答案可能无法作为您问题的解决方案脱颖而出(除非您专门接受它作为答案)
    • 谢谢我会编辑这个,卡洛斯上面的回答可能比我的更有帮助,更具体一点。
    【解决方案3】:

    试试这个:

    max_rate = []
    min_rate = [] 
    count = 0
    total = 0
    
    with open(file_names, "r") as file_out:
      # skips the headers in the file
      next(file_out)
    
      # reset max, min, total sum and count
      max_rate = []
      min_rate = []
      total = 0
      count = 0
      for line in file_out: 
        values = line.split(",")
        max_rate = max(values, max_rate or values, key=lambda x: x[6])
        min_rate = min(values, min_rate or values, key=lambda x: x[6])
    
        # sum up all rates in the rates column
        total += float(values[6])
        count += 1
    
      avg_rate = total / count
      print(avg_rate)
    

    这将按照您的预期将与第 6 列相关的 minmax 的整个列表归于。 max_rate or values 代码将评估 valuesmax_rate 列表之间的最大值,前提是 max_rate 不为空(在 for 循环的第一次交互中就是这种情况),这将阻止 IndexErrormin_rate也一样

    我对您的代码所做的一项重要更改是变量sum 的名称。这是一个 Python 注册的关键字,将其用作变量名并不是一个好习惯,因此最好使用类似 totaltotal_sum 的名称。

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2021-03-19
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多