【问题标题】:Pandas cumsum on pivoted dataframePandas cumsum 在旋转数据帧上
【发布时间】:2017-07-10 17:26:28
【问题描述】:

我有一个表单的旋转数据框。

      Quantity             Result            
Alpha        A    B    C        A     B     C
Order                                        
1          3.0  0.0  0.0     Best  None  None
2          0.0  6.0  4.0     None  Good  Good
3          3.0  0.0  0.0  Average  None  None

并且我正在尝试创建另一个名为 CumulativeQty 的主要列,其中包含 3 列,我希望它们成为主要列 Quantity 中相应 3 列的 cumsum()。如果不单独指定次要列,我将如何处理?我试过了

p['CumulativeQty'] = p['Quantity'].cumsum(axis=1)

但这抱怨 ValueError: Wrong number of items passed 3, placement 暗示 1.

想要的结果是

            CumulativeQty                     
Alpha        A    B    C      
Order                                        
1          3.0  0.0  0.0     
2          3.0  6.0  4.0     
3          6.0  6.0  4.0  

以下是如何获取起始透视数据框。

df = pd.DataFrame(data=[[1, "A", 3, "Best"], [2, "C", 4, "Good"], [2, "B", 6, "Good"], [3, "A", 3, "Average"]],
                  columns=["Order", "Alpha", "Quantity", "Result"])
p = df.pivot(index="Order", columns="Alpha")
p['Quantity'] = p['Quantity'].fillna(0)

【问题讨论】:

    标签: python pandas pivot-table cumsum


    【解决方案1】:

    选项 1

    p.join(p[['Quantity']].cumsum().rename(columns=dict(Quantity='Cumsum')))
    
          Quantity             Result             Cumsum          
    Alpha        A    B    C        A     B     C      A    B    C
    Order                                                         
    1          3.0  0.0  0.0     Best  None  None    3.0  0.0  0.0
    2          0.0  6.0  4.0     None  Good  Good    3.0  6.0  4.0
    3          3.0  0.0  0.0  Average  None  None    6.0  6.0  4.0
    

    选项 2

    pd.concat([
            p.Quantity, p.Result, p.Quantity.cumsum()
        ], axis=1, keys=['Quantity', 'Result', 'Cumsum'])
    
          Quantity             Result             Cumsum          
    Alpha        A    B    C        A     B     C      A    B    C
    Order                                                         
    1          3.0  0.0  0.0     Best  None  None    3.0  0.0  0.0
    2          0.0  6.0  4.0     None  Good  Good    3.0  6.0  4.0
    3          3.0  0.0  0.0  Average  None  None    6.0  6.0  4.0
    

    【讨论】:

      【解决方案2】:

      一种方法是:

      for i in sorted(df.Alpha):
          p['CumulativeQty',i] = p['Quantity',i].cumsum(axis=0)
      

      请注意,我将 axis=1 更改为 axis=0,因为您是水平求和,因此您没有得到想要的输出。

      输出:

            Quantity             Result             CumulativeQty          
      Alpha        A    B    C        A     B     C             A    B    C
      Order                                                                
      1          3.0  0.0  0.0     Best  None  None           3.0  0.0  0.0
      2          0.0  6.0  4.0     None  Good  Good           3.0  6.0  4.0
      3          3.0  0.0  0.0  Average  None  None           6.0  6.0  4.0
      

      您的问题基本上是您试图将所有A B and C 结果放在一列中。所以这基本上是一个“MultiIndex”问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 2020-11-15
        相关资源
        最近更新 更多