【问题标题】:How to find cumulative sum of items in a list of multiple dictionaries in python如何在python中的多个字典列表中查找项目的累积总和
【发布时间】:2021-07-18 07:41:45
【问题描述】:

我有一个由字典(公司和收入)组成的列表。我想对此列表进行 ABC 分析,并正在寻找最有效的方法。

myList = [{"Company":"Company A", "Revenue":100}, {"Company":"Company B", "Revenue":350}, {"Company":"Company C", "Revenue":80}]

我想使用 numpy 的 cumsum。所以我首先必须以相反的顺序对收入进行排序。我会这样做:

newList = sorted(myList, key=lambda k: k['Revenue'], reverse=True)

我现在如何获得收入的累积总和,以便能够进行 ABC 分析?

【问题讨论】:

    标签: python list numpy dictionary


    【解决方案1】:

    使用numpy.cumsum():

    Try it online!

    import numpy as np
    myList = [{"Company":"Company A", "Revenue":100}, {"Company":"Company B", "Revenue":350}, {"Company":"Company C", "Revenue":80}]
    newList = sorted(myList, key=lambda k: k['Revenue'], reverse=True)
    a = np.array([e['Revenue'] for e in newList])
    print(a.cumsum())
    

    输出:

    [350 450 530]
    

    您也可以只使用 Python 的标准 itertools.accumulate()

    Try it online!

    import itertools
    myList = [{"Company":"Company A", "Revenue":100}, {"Company":"Company B", "Revenue":350}, {"Company":"Company C", "Revenue":80}]
    newList = sorted(myList, key=lambda k: k['Revenue'], reverse=True)
    a = [e['Revenue'] for e in newList]
    print(list(itertools.accumulate(a)))
    

    输出:

    [350, 450, 530]
    

    【讨论】:

      【解决方案2】:

      关于你的工作,Pandas 似乎更适合。这是一个例子:

      df = pd.DataFrame(myList)                             # Create a dataframe
      sortedDf = df.sort_values('Revenue', ascending=False) # Sort by revenue
      result = sortedDf['Revenue'].to_numpy().cumsum()      # Make the cumulative sum
      
      print(sortedDf)
      print(result)
      

      结果如下:

           Company  Revenue
      1  Company B      350
      0  Company A      100
      2  Company C       80
      
      [350 450 530]
      

      请注意,Pandas 在内部使用 Numpy 来存储其列。请注意,您可以直接在数据帧上进行累积和,以保留元信息并进行进一步计算。

      【讨论】:

        【解决方案3】:

        在对Revenue 中的值进行降序排序后,让我们尝试使用np.cumsum

        np.cumsum(sorted([d['Revenue'] for d in myList], reverse=True))
        

        array([350, 450, 530])
        

        【讨论】:

          猜你喜欢
          • 2016-12-27
          • 2013-03-31
          • 1970-01-01
          • 2018-07-02
          • 2017-10-05
          • 2018-01-16
          • 1970-01-01
          • 1970-01-01
          • 2017-06-26
          相关资源
          最近更新 更多