【问题标题】:Add quarterly data in a list into a yearly将列表中的季度数据添加到年度
【发布时间】:2021-10-10 03:27:13
【问题描述】:

我有一个包含季度数据的数据集。

示例: [2019, 1, 10, 20, 5],

[2019, 10, 56, 34],
[2019, 74, 66 ,32],
[2019, 20, 96, 31],
[2018, 13, 16, 35],
.....

我想总结和计算平均值并找到每年的最大值和最小值(取决于列)并将结果添加到新列表中。 第 1 列 -> 平均值,第 2 列,找到最大值,第 3 列找到最小值;

[2019, 26.25,  96, 31]
[2018 .....]
...

我不知道如何解决这个问题,我不能使用 pandas 或 numpy

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    创建格式为year: [list, number of quartals]的字典d = {}

    遍历原始列表

    for yr, x,y,z in data: 
        if yr not in d:
            d[yr] = [[yr, x, y, z], 1]
        # now make changes
        else:
            a = d[yr]
            e, n = a
            e[1] += x
            e[2] = max(e[2], y)
            e[3] = min(e[3], z)
            a[1] += 1
    

    现在再次遍历 d 以除以 e[1] / a[1] 以获得平均值
    并将e's 放入结果列表中

    【讨论】:

      【解决方案2】:

      您可以执行以下操作 -

      方法 1:使用 PANDAS

      #Mention all the columns and respective aggregations as key, value for a dict
      g = {'var2':'mean', 'var3':'max', 'var4':'min'}
      
      
      #Apply groupby with agg() using the above dict
      df.groupby(['var1']).agg(g).reset_index()
      

      只需将var1var2var3var4 替换为代码中的实际变量名即可。

         var1       var2  var3  var4
      0  2018  13.000000    16    35
      1  2019  34.666667    96    31
      

      编辑:如果您不应该使用任何 pandas 或 numpy,那么我必须假设您的数据集实际上是一个列表列表,而不是一个会破坏目的的 pandas 数据框。在这种情况下,您可以使用列表推导通过以下方式解决此问题 -

      方法 2:使用列表理解

      data = [[2019, 10, 56, 34],[2019, 74, 66 ,32],[2019, 20, 96, 31],[2018, 13, 16, 35], [2018, 14, 27, 33]]
      
      #function to calculate average on a list
      def average(lst): 
          return sum(lst) / len(lst)
      
      #get set list of years
      unique_years = set([i[0] for i in data])
      
      [[[j[0] for j in data if j[0]==i][0],
         average([j[1] for j in data if j[0]==i]),
         max([j[2] for j in data if j[0]==i]),
         min([j[3] for j in data if j[0]==i])] for i in unique_years]
      
      #output: [[2018, 13.5, 27, 33], [2019, 34.666666666666664, 96, 31]]
      

      如果您对列表推导不满意,也可以使用显式 for 循环来实现 -

      方法 3:使用显式 FOR - IF

      yr = []
      v1 = []
      v2 = []
      v3 = []
      
      #function to calculate average on a list
      def average(lst): 
          return sum(lst) / len(lst)
      
      #get set list of years
      unique_years = set([i[0] for i in data])
      
      for i in unique_years:
          for j in data:
              if j[0]==i:
                  v1.append(j[1])
                  v2.append(j[2])
                  v3.append(j[3])
          yr.append([i,average(v1),max(v2), min(v3)])
          
      print(yr)
      
      #output: [[2018, 13.5, 27, 33], [2019, 26.2, 96, 31]]
      

      【讨论】:

      • 他们说“我不能使用 pandas 或 numpy”,我确信他们不会创建自己的数据框结构
      • 当你说“他们说”时,这像是一个面试问题吗?因为这可能不是问它的正确地方:)
      • 另外,您的数据是熊猫数据集还是列表列表?
      • @Akshay_Sehgal 这不是问题。这是一个声明。他们是这么说的。
      • 他们 = OP:我不知道如何解决这个问题,我不能使用 pandas 或 numpy
      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2021-03-08
      相关资源
      最近更新 更多