Pandas 透视数据帧上的 cumsum

Pandas cumsum on pivoted dataframe

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

      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:通过 3 的项目数量错误,放置意味着 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)

选项 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

一种方法是:

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" 问题。